Python - 按价值与参考

时间:2015-07-24 06:33:57

标签: python methods pass-by-reference pass-by-value

直到最近,我还以为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']

此处列表没有变化。我的问题是

  

为什么会出现这些不同的情况?

1 个答案:

答案 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(从中删除第一个元素),因此它反映在调用函数的地方好。