2012-11-21 60 views
1

假設我有一個Python中的值表。我生成的表是這樣的:分配到列表中的位置

table = [[True] * 11] * 7 

這使得7所列出清單,每個包含11個True值:

[[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True]] 

說我改變table[6][4]Falsetable[6][4] = False)。我希望只,要改變槽:

[[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True True True True True True True True], 
[True True True True False True True True True True True]] 

但很顯然,在所有其他列表中的第4列也改變了:

[[True True True True False True True True True True True], 
[True True True True False True True True True True True], 
[True True True True False True True True True True True], 
[True True True True False True True True True True True], 
[True True True True False True True True True True True], 
[True True True True False True True True True True True], 
[True True True True False True True True True True True]] 

這是怎麼回事?

回答

4

如果你

table = [[True] * 11] * 7 

您創建了11 True個列表,然後你把它包在一個列表七倍。不是通過複製它,而是通過多次引用它。

如果創建了7名不同的列表,如在

table = [[True] * 11 for _ in range(7)] 

你最好。

+0

+1用於說明如何製作不同的列表。 – Tim

+0

+1 - 以「正確」方式擊敗我:) – RocketDonkey

4

表中的7個元素中的每一個指向相同的列表?

>>> x = range(5) 
>>> y = x 
>>> print x 
[0, 1, 2, 3, 4] 
>>> print y 
[0, 1, 2, 3, 4] 
>>> x.append("ABC") 
>>> print x 
[0, 1, 2, 3, 4, 'ABC'] 
>>> print y 
[0, 1, 2, 3, 4, 'ABC'] 

您可以使用deepcopy以確保你總是加入列表的新實例:

from copy import deepcopy 
table = [[True] * 11] * 7 
table = [deepcopy(x) for x in table] 
# now this will behave as you expected 
table[6][4] = False 
+0

+1因爲你在第一次得到這個 - 對不起,直到後來纔看到一些答案:) – RocketDonkey

+0

它沒有產生預期的結果 – raton

+0

@raton是正確的,這仍然產生我的舊結果。 –

3

當您在這種方式的列表,它們都指向同一個內存位置,所以任何變化將體現在每個列表:

In [1]: table = [[True] * 11] * 7 

In [2]: id(table[0]) 
Out[2]: 17815672 

In [3]: id(table[1]) 
Out[4]: 17815672 

至於正確的方法來創建表,@ glglgl的答案是要走的路。