2015-11-26 63 views
-2

我想改變一個嵌套列表中的一個單元格,並獲取所有嵌套列表中的單元格。python嵌套列表中的一個bug

例如:

>>> temp_list = [['a']*2]*3 
>>> temp_list 
[['a', 'a'], ['a', 'a'], ['a', 'a']] 
>>> temp_list[2][0] = 'b' 
>>> temp_list 
[['b', 'a'], ['b', 'a'], ['b', 'a']] 
>>> 

在此先感謝!

+0

這是因爲[ '一'] [地址的 'A',地址 '一']而不是[數據 'A',數據「一的* 2]製作列表「]。當你做了分配時,那個地址的值被更新而不是數據。 –

+0

這不是一個錯誤。列表是一個可變的序列類型。 檢查此網址:https://docs.python.org/2/library/functions.html#list –

+0

另一個有趣的鏈接,瞭解正在發生的事情:https://en.wikibooks.org/wiki/Python_Programming/列表#List_creation_shortcuts – Antwane

回答

2

我知道,這聽起來很錯誤的,但...

這是不是一個錯誤,這是一個特點。

>>> [id(x) for x in temp_list] 
[4473545216, 4473545216, 4473545216] 

正如你可以看到,他們都有着相同的參考。因此,您需要創建列表的副本。

0

2.7中我得到了相同的行爲。來自*擴展的每個實例引用相同的變量。

>>> temp_list = [['a']*2]*3 
>>> temp_list 
[['a', 'a'], ['a', 'a'], ['a', 'a']] 
>>> temp_list[2][0] = 'b' 
>>> temp_list 
[['b', 'a'], ['b', 'a'], ['b', 'a']] 
>>> temp_list[1][0] = 'c' 
>>> temp_list 
[['c', 'a'], ['c', 'a'], ['c', 'a']] 
>>> temp_list[1][1] = 'x' 
>>> temp_list 
[['c', 'x'], ['c', 'x'], ['c', 'x']] 

參見:Python initializing a list of lists