直到最近,我还以为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']
此处列表没有变化。我的问题是
为什么会出现这些不同的情况?
答案 0 :(得分:0)
Python始终passes by assignment,即使在第一种情况下,实际上也传递了对象引用。但是当您在函数内部进行赋值时,您将使该名称引用一个新对象。这不会改变用于将值传递给函数的名称/变量(在下面的示例中更好地解释)。
示例 -
>>> 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
(从中删除第一个元素),因此它反映在调用函数的地方好。