2013-12-13 30 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'] 
>>>