【问题标题】:Python -- by value vs by reference [duplicate]Python——按值与按引用[重复]
【发布时间】:2015-10-14 17:23:00
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2017-09-04
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多