2013-12-13 19 views
-1

我有这样的代码:在python分配值,结果并不如预期

x = 'x' 
y = [] 
y.append(x) 
z = y 
z.append('a') 
x = 'X' 

print "x:", x 
print "y:", y 
print "z:", z 

输出:

x: X 
y: ['x', 'a'] 
z: ['x', 'a'] 

我知道,这是正确的输出,但我有一个很难理解为什么它会产生

y: ['x', 'a'] 

,而不是

y: ['x'] 
+0

回答这类问题应该是阻止关闭和标记为“重复”,而不是一次又一次地回答数百次之后。这种问题是否会被解答,直到1000年的计算器生命结束?我也很震惊,有很多人提出了答案,尤其是对信誉得分最高的成员。 – eyquem

回答

6

通过将y分配给z,您并未创建列表的副本。您只是创建了另一个对同一个列表对象的引用。

如果你想y是列表的副本,你需要建立明确这样一个副本:

z = list(y) 

z = y[:] 
1

您当前的代码创建z是一个参考y本身。含义,zy指向内存中的同一个列表对象。

要解决该问题,请z一个复制y的,而不是对它的引用:

z = y[:] 

下面是一个演示:

>>> x = 'x' 
>>> y = [] 
>>> y.append(x) 
>>> z = y[:] # Make z a copy of y 
>>> z.append('a') 
>>> x = 'X' 
>>> print "x:", x 
x: X 
>>> print "y:", y 
y: ['x'] 
>>> print "z:", z 
z: ['x', 'a'] 
>>>