Python:通过引用传递修改参数

标签 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”的值会在函数内部发生变化呢?而且只有当我对其执行某些操作时才会出现这种情况,而不是当我为其分配全新的值时?

谢谢!

最佳答案

因为参数是通过赋值传递的,所以参数名称 函数中可以与调用范围内的变量共享对象。因此,对函数中可变参数的就地更改可能会影响调用者。

第一次在您的代码中,因为您使用 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/

相关文章:

大数据集(>19000 行)上的 Python All 与 All 比率比较不断崩溃

python - 使用 Socket 发送原始 POST 请求

python 和 Pandas : series to timedelta

c# - 检查引用参数值或返回 bool 值?

javascript - 为什么这段代码不替换每个单词的第一个字母?

arrays - Swift:使用&符号(&)引用对象的属性导致编译器错误

c++ - const 引用函数参数 : Is it possible to disallow temporary objects?

python - 使用字典转换字母

python - 用python重写for循环函数,需要帮助才能更好地理解

java - 更改方法中原始变量的值?