Python -- 按值与按引用

Python -- by value vs by reference

直到最近,我还认为 Python 按值传递参数。例如,

def method1(n):
   n = 5
   return n

n = 1
m = method1(n)
>>> n == 5
>>> False

但是如果我将一个列表传递给一个方法,比如

def method2(list):
   del list[0]
   return list

list1 = [0,1,2,3,4,5]
list2 = method2(list1)
>>> list1
>>> [1,2,3,4,5]

它改变了列表。我做了另一个测试:

l1 = ['a','b','c','d']
x = method1(l1)
>>> l1
>>> ['a','b','c','d']

这里的列表没有变化。我的问题是

Why do these different cases happen?

Python 总是 passes by assignment ,即使在第一种情况下,实际上也传递了对象引用。但是当你在函数内部进行赋值时,你会导致名称引用一个新对象。这不会改变用于将值传递给函数的 name/variable(在下面的示例中有更好的解释)。

例子-

>>> def func(n):
...     n = [1,2,3,4]
...     return n
...
>>> l = [1,2,3]
>>> func(l)
[1, 2, 3, 4]
>>> l
[1, 2, 3]

在您的情况下,当您执行 del list[0] 时,您实际上是在原地改变 list(从中删除第一个元素),因此它反映在调用函数的位置来自也。