【发布时间】:2017-08-02 06:06:54
【问题描述】:
我会期待以下代码:
def a(l):
l.append(3)
def b(l):
l = 5
def c(l):
l = (2,-2)
numbers = [1,2,3,4,5]
a(numbers)
print(numbers)
b(numbers)
print(numbers)
c(numbers)
print(numbers)
打印:
[1, 2, 3, 4, 5, 3]
5
(2,-2)
但它会打印:
[1, 2, 3, 4, 5, 3]
[1, 2, 3, 4, 5, 3]
[1, 2, 3, 4, 5, 3]
为什么??
编辑:
这是因为引用传递和共享调用的区别!
【问题讨论】:
-
也许您将 pass-by-reference 与传递 as 引用的对象混淆(即在 Python 中,对象传递 as 引用)?
-
在第一种情况下,您传入一个可变对象并对其进行变异。在其他情况下,您将本地名称更改为指向新值并且这不会更改调用范围,您需要
return l将该值返回到调用范围,例如numbers = b(numbers) -
@AChampion 它仍然不会更新原始的
l变量。这需要将返回值分配给(全局)变量。 -
@FelixKling 我认为您是对的,请您指定通过引用传递和作为参考传递之间的差异吗?