希望以下描述能够很好地总结:
这里有两件事情需要考虑 - 变量和对象。
- 如果你传递一个变量,那么它是按值传递的,这意味着在函数内部对变量所做的更改仅在该函数中局部有效,因此不会全局反映。这更像是C语言的行为。
示例:
def changeval( myvar ):
myvar = 20;
print "values inside the function: ", myvar
return
myvar = 10;
changeval( myvar );
print "values outside the function: ", myvar
输出:
values inside the function: 20
values outside the function: 10
- 如果您将变量打包在可变对象(比如列表)中传递,那么只要未对该对象进行重新赋值,对该对象所做的更改将在全局范围内反映。
示例:
def changelist( mylist ):
mylist2=['a'];
mylist.append(mylist2);
print "values inside the function: ", mylist
return
mylist = [1,2,3];
changelist( mylist );
print "values outside the function: ", mylist
values inside the function: [1, 2, 3, ['a']]
values outside the function: [1, 2, 3, ['a']]
- 现在考虑对象被重新赋值的情况。在这种情况下,对象引用一个新的内存位置,它是局部于此发生的函数的,并且因此不会在全局范围内反映。
示例:
def changelist( mylist ):
mylist=['a'];
print "values inside the function: ", mylist
return
mylist = [1,2,3];
changelist( mylist );
print "values outside the function: ", mylist
values inside the function: ['a']
values outside the function: [1, 2, 3]
n
会被改变,你使用一个新变量square
来存储计算结果。 - Facundo Casco