Python:按引用传递修改参数

时间:2015-02-18 13:39:33

标签: python pass-by-reference

我在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”的值会从函数内部发生变化?只有当我对它执行某些操作时,而且当我为它分配全新值时才会这样做?

谢谢!

3 个答案:

答案 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.copycopy.deepcopy