【发布时间】:2017-11-24 12:55:39
【问题描述】:
我有以下代码:
def proc2(p):
p=p+[1]
y=[2,5]
proc2(y)
print(y)
z=[2,5]
z=z+[1]
print(z)
代码的输出是:
[2, 5]
[2, 5, 1]
我了解 y 未修改为[2,5,1]。但是,y 被重新分配到一个新列表,即[2,5,1],对吗?那为什么 y 仍然引用原始值? 如果 z 的值改变了,为什么 y 不改变?
附:我刚刚问了一个question,和这个几乎一样。该问题已被标记为与另一个问题重复。但是,我认为它们有点不同。这就是为什么我再次发布我的问题。我想我一定错过了一些关于功能的东西。
【问题讨论】:
-
在
proc2()中,附加了p列表,然后将p重新分配给更长的列表。正如您所提到的,这不会影响仍然指向较短列表的y。但是,在您的第二个示例中,z实际上被重新分配为指向附加列表。 -
分配给
z的原始列表的值实际上没有改变。您根本不再引用它。如果你做了例如old_z = z之前z += 1,然后打印old_z,你会看到的。行为没有区别。 -
p=p+[1]不会修改p之前引用的列表。它修改 变量p以引用新列表。另一个变量,仍然引用 old 列表,不会受到影响。 -
@jonrsharpe 你说的,我完全明白了。但是,在运行
proc2(y)之后,y 现在应该指向新列表[2,5,1]。那么为什么当我打印 y 时,python 说 y 仍然指向[2,5]? -
因为它仍然引用旧列表?只有局部变量 p 被重新分配。
标签: python python-3.x