2011-10-12 168 views
25

我已經遇到了我認爲是Python中的一個奇怪行爲,如果可能的話我希望有人解釋它。附加到Python中的2D列表

我創建了一個空的2D名單

listy = [[]]*3 

print listy 

[[], [], []] 

如我期望的以下工作:

listy[1] = [1,2]產量[[], [1,2], []]

listy[1].append(3)產量[[], [1,2,3], []]

然而,當我附加到其中一個空列表,python附加到所有的子列表,如下所示:

listy[2].append(1)收益率[[1], [1,2,3], [1]]

任何人都可以向我解釋爲什麼會出現這種情況嗎?

+4

我不知道每月會有多少次被問到。當然,這是關於Python的最常見問題之一(而不僅僅是Stack Overflow)。從官方Python文檔中的FAQ:[如何創建多維列表?](http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) –

回答

44

您還沒有創建三個不同的空列表。你已經創建了一個空的列表,然後創建了一個新列表,其中有三個引用,即相同的空列表。要解決此問題使用此代碼來代替:

listy = [[] for i in range(3)] 

現在運行您的示例代碼給出結果,你可能期望:

>>> listy = [[] for i in range(3)] 
>>> listy[1] = [1,2] 
>>> listy 
[[], [1, 2], []] 
>>> listy[1].append(3) 
>>> listy 
[[], [1, 2, 3], []] 
>>> listy[2].append(1) 
>>> listy 
[[], [1, 2, 3], [1]] 
+0

+1進行詳細解釋 – heltonbiker

+0

這非常有道理。謝謝。 –

12

[[]]*3是不一樣的[[], [], []]

這是因爲如果你說

a = [] 
listy = [a, a, a] 

換句話說,所有三個列表的引用指向同一個列表實例。