我在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”的值会从函数内部发生变化?只有当我对它执行某些操作时,而且当我为它分配全新值时才会这样做?
谢谢!
答案 0 :(得分:1)
因为参数是通过赋值,参数名称传递的 在函数中可以与调用范围内的变量共享对象。因此,函数中可变参数的就地更改可能会影响调用者。
由于您使用sort()
函数并且它在原地更改了x
,因此它首次出现在您的代码中,它会影响调用者并全局更改x!但是当您分配新对象时到x
实际上你在函数内部创建了一个局部变量来引用你的新对象([1, 2, 3]
)。
因此,为避免Mutable Argument Changes,您可以将变量的副本传递给函数:
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]
另一种方法是你可以将你的参数转换为一个不可变的对象,它会改变它会引发一个错误,在这种情况下你可以将你的列表转换为元组:
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'
答案 1 :(得分:1)
您正在将一个对象值传递给您的函数,然后您正在修改该对象。这会改变对象。只有一个对象,当你将对象传递给函数时,Python不会创建对象的独立副本。
现在,如果您将一个完全不同的对象分配给变量 x
,那么这对x
之前的对象没有任何作用。它只是打破了从x
到该对象的引用。由于该对象仍由mylist
引用,因此它仍然存在。
答案 2 :(得分:0)
这很简单:python不是通过值传递参数(意思是副本),而是通过引用传递参数。因此,在sortList中,您可以操作传入的相同列表。由开发人员决定是否可以解决此问题。一种方法是使用sorted
调用,它为您提供序列的排序副本。其他涉及使用copy.copy
或copy.deepcopy