我有这段Python代码:
def sortList(x):
x.sort()
print "Values inside the function: ", x
return
mylist = [100,20,30];
sortList(mylist);
print "Values outside the function: ", mylist
输出为:
Values inside the function: [20, 30, 100] Values outside the function: [20, 30, 100]
现在,不要写 x.sort()
如果我写x=[1,2,3]
那么输出是:
Values inside the function: [1, 2, 3] Values outside the function: [100, 20, 20]
那么为什么数组“mylist”的值会在函数内部发生变化呢?而且只有当我对其执行某些操作时才会出现这种情况,而不是当我为其分配全新的值时?
谢谢!
最佳答案
因为参数是通过赋值传递的,所以参数名称 函数中可以与调用范围内的变量共享对象。因此,对函数中可变参数的就地更改可能会影响调用者。
第一次在您的代码中,因为您使用 sort()
函数,并且它就地更改了 x
,它会影响调用者并全局更改 x !但是,当您将新对象分配给 x
时,实际上您在函数内部创建了一个引用新对象的局部变量 ([1, 2, 3]
)。
因此,为了避免可变参数更改,您可以将变量的副本传递给函数:
mylist = [100,20,30];
sortList(mylist[:]);
print "Values outside the function: ", mylist
结果:
Values inside the function: [20, 30, 100]
Values outside the function: [100, 20, 30]
作为另一种方法,您可以将参数转换为不可变对象(immutable对象),该对象的更改会引发错误,在这种情况下,您可以将列表转换为元组:
mylist = [100,20,30];
sortList(tuple(mylist));
print "Values outside the function: ", mylist
Traceback (most recent call last):
File "/home/bluebird/Desktop/try.py", line 7, in <module>
sortList(tuple(mylist));
File "/home/bluebird/Desktop/try.py", line 2, in sortList
x.sort()
AttributeError: 'tuple' object has no attribute 'sort'
关于Python:通过引用传递修改参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585045/