2014-11-04 66 views
1

我試圖修改列表清單內:重新分配列表的元素列表

list = [['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0']] 
特別

當我分配list[0][1]='X'list現在是:

[['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0']] 

,而不是隻重新分配第一個子列表的第二個元素,它重新分配每個子列表的第一個元素。我不明白爲什麼會發生這種情況。有人知道嗎?

+0

這是因爲你如何創建'list'。請說明你是如何做到的。 – 2014-11-04 21:34:38

+0

因爲你的'list'包含對同一列表的多個引用。 – khelwood 2014-11-04 21:35:34

+0

這是關於SO(我正在尋找最好的一個)的幾十個問題的重複,再加上[官方Python FAQ中的一個條目](https://docs.python.org/3/faq/programming。 HTML#怎麼辦,我創建-A-多維列表)。 – abarnert 2014-11-04 21:38:30

回答

3

必須已創建list像這樣:

list = [['0', '0', '0', '0', '0', '0']] * 5 

這樣做創建五個引用相同列表對象的列表:

>>> list = [['0', '0', '0', '0', '0', '0']] * 5 
>>> id(list[0]) 
27391360 
>>> id(list[1]) 
27391360 
>>> id(list[2]) 
27391360 
>>> 

所以,當你修改一個子列表,它們都會被更改。


要解決此問題,使用list comprehension代替:

lst = [['0', '0', '0', '0', '0', '0'] for _ in range(5)] 

與當前的代碼,該解決方案將創造五分獨特子列表清單。因此,改變一個不會影響其他人。

此外,我將您的清單名稱更改爲lst,以避免影響built-in。你不應該創建一個與內置相同的名字。


注意,你也可以這樣寫:

lst = [['0'] * 6 for _ in range(5)] 

['0'] * 6這裏不是問題,因爲字符串在Python immutable objects。因此,['0'] * 6創建一個包含六個唯一字符串對象的列表。然而,列表是mutable objects,因此不能像這樣創建。

+0

'lst = [6 * ['0'] for _ in range(5)]'更簡潔。 – khelwood 2014-11-04 21:37:20

+0

@khelwood - 好主意。我會提到它。 – iCodez 2014-11-04 21:38:29

+0

謝謝你們,問題解決了。一個問題,但。如果列表['0','0','0','0','0','0']不總是相同的,但它存儲在某個變量a中,那麼如何重寫部分「for _ in ...」? – 2014-11-04 22:50:30