2011-06-15 51 views
7

我創建列表的列表,並要追加的項目將個別名單,但是當我嘗試添加到列表中的一個(a[0].append(2)),該項目被添加到所有列表。爲什麼foo.append(bar)會影響列表列表中的所有元素?

a=[] 
b=[1] 

a.append(b) 
a.append(b) 

a[0].append(2) 
a[1].append(3) 
print a 

給出:[[1, 2, 3], [1, 2, 3]]

而我希望:[[1, 2], [1, 3]]

改變我構造列表的初始列表的方式,使b一個浮動,而不是一個列表,並把括號內.append (),給我所需的輸出:

a=[] 
b=1 

a.append([b]) 
a.append([b]) 

a[0].append(2) 
a[1].append(3) 
print a 

給出:[[1, 2], [1, 3]]

但是,爲什麼?結果應該不一樣,這並不直觀。我知道這與multiple references to the same list有關,但我不知道發生了什麼。

回答

20

這是因爲列表包含對對象的引用。您的列表不包含[[1 2 3] [1 2 3]],它是[<reference to b> <reference to b>]

當您更改對象(通過附加的東西b),要更改對象本身,而不是包含對象名單。

爲了得到您想要的效果,您的清單a必須包含b的副本,而不是引用b。要複製列表,您可以使用範圍[:]。例如:

>>> a=[] 
>>> b=[1] 
>>> a.append(b[:]) 
>>> a.append(b[:]) 
>>> a[0].append(2) 
>>> a[1].append(3) 
>>> print a 
[[1, 2], [1, 3]] 
+0

謝謝,現在非常有意義。 – litturt 2011-06-17 14:32:04

1

的關鍵是這一部分:

a.append(b) 
a.append(b) 

你兩次追加相同的列表,這樣既a[0]a[1]是同一列表的引用。

在你的第二個例子,你正在創造新的名單在每次調用追加喜歡a.append([b])時間,所以他們是與同一浮點值初始化單獨的對象。

+0

謝謝,這個答案也增加了我的理解。 – litturt 2011-06-17 14:33:59

1

爲了使列表的淺表副本,這個成語是

a.append(b[:]) 

,當一倍將導致有這不會給你的混雜錯誤您彙報名單b的兩個新副本。

相關問題