下面有两份代码一份是python,一份是c++,这里python中的变量连续当作参数传递给函数,而导致结果的变化,实际原因是:list是一个变量指向[],每当调用一次函数也就相当于当前list与test是指向同一对象的变量,每次list向末尾添加一个单词后那么,test所指向的对象的值肯定也变化,跟下面c++这个全局变量目前感觉有点相似。
def add(list = []):
list.append('end')
return list
test = ['a', 'v', 'd']
print(add(test)) #output ['a', 'v', 'd', 'end']
print(add(test)) #output ['a', 'v', 'd', 'end', 'end']
print(add()) #output ['end']
print(add()) #output ['end', 'end']
#include <iostream>
using namespace std;
string s = "abc";
string change()
{
return s += 'a';
}
int main()
{
cout << change() << endl;
cout << change() << endl;
return 0;
}
python中传递的list型变量与参数实际操作的是同一块儿地址。也就是当前list指向的对象[]是可变的,函数中对list进行改变,那么test也相应改变,则见代码:
def add(list = None):
if list is None:
list = []
list.append('end')
return list
test = ['a', 'v', 'd']
print(add(test)) #output ['a', 'v', 'd', 'end']
print(test) #output ['a', 'v', 'd', 'end']
对于str这种不可变类型来说,函数中对其的改变不能引起原来变量的变化,因为a和s指向的是两个地址
def add(a):
a += 'a'
return a
s = 'abc'
print(add(s)) #output abca
print(s) #output abc
再看看这个,None是个不变对象,因此这里的两个输出相同
def add(list = None):
if list is None:
list = []
list.append('end')
return list
print(add()) #output ['end']
print(add()) #output ['end']