2012-04-17 237 views
1

可能重複:
Python list problem奇怪的行爲

我不明白列出的行爲在Python:

>>> a1 = [[0,0],[0,0]] 
>>> a2 = [[0]*2]*2 
>>> a1 
[[0, 0], [0, 0]] 
>>> a2 
[[0, 0], [0, 0]] 
>>> a1[0][0] = 1 
>>> a2[0][0] = 1 
>>> a1 
[[1, 0], [0, 0]] 
>>> a2 
[[1, 0], [1, 0]] 

爲什麼一個要素分配影響到另一個元素?感謝您的回答!

+0

相關Python關於[多維列表]的FAQ(http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) – 2012-04-17 13:00:28

回答

6

當您乘以一個列表時,它將引用複製到列表中,但不創建列表的副本。由於列表是可變的,因此當您更改它時,所有對它的引用都會被更改。

在ASCII藝術方面:

a1 --- [list1, list2] --- list1 = [0, 0] 
         --- list2 = [0, 0] 

a2 --- [list3, list3] --- list3 = [0, 0] 

你可以清楚地看到,改變項目list3會影響兩個位置。

如果不想複製引用創建可變長度的名單,則應該做這樣的事情:

>>> a2 = [[0]*2 for _ in range(2)] 
>>> a2[0][0] = 1 
>>> a2 
[[1, 0], [0, 0]] 

這裏,以創造新的元素各一次,而不是複製我們使用的是list comprehension引用舊元素。在更復雜的情況下,如果您想要重複存在可變對象,則可能需要使用the copy module

注意[0]*2操作仍然可以,因爲Python中的int是不可變的,並且不能更改,所以如果您有對同一對象的引用並不重要。

+0

非常感謝您的回答。這是我的秋天。我試圖找到答案docs.python.org但沒有找到。對不起,這個非常簡單的問題。 – maxsocl 2012-04-17 13:06:16

+0

@misokolsky如果這回答你的問題,請隨時[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)。 – 2012-04-17 13:07:08