2017-01-23 62 views
0

我一直在Python中使用[Value] * Count表示法來初始化列表。例如,[False] * 3導致創建列表[False, False False]。我嘗試使用相同的符號來初始化列表的列表。Python列表中可變對象的ID

>>>a = [[0] * 2] * 3 
>>>print a 
[[0, 0], [0, 0], [0, 0]] 
>>>a[0][1] = 23 
>>>print a 
[[0, 23], [0, 23], [0, 23]] 
>>>id(a[0]) 
139978350226680 
>>>id(a[1]) 
139978350226680 
>>>id(a[2]) 
139978350226680 

正如我們可以看到,一個元素是指一個單獨的列表,而不是三次提到三個不同的列表。 1.爲什麼會發生這種情況? 2.什麼是初始化列表清單的正確方法?

同樣的行爲已經指出了以前的答案:https://stackoverflow.com/a/13382804/4716199

+0

「正確的」方法是使用for循環或列表理解。 –

+0

如果你做了'b = [0] * 2; a = [b] * 3'你會驚訝於'a'包含3個對'b'的引用嗎? –

+0

@ PM2Ring這很有道理。我沒有意識到*不會創建新的副本,它只是複製參考。感謝:) – Sidhant

回答

1

這就是*經營者名單上的行爲:它並沒有複印,但份參考。這是有道理的,因爲它一般是甚至沒有定義如何複製,所以Python只能複製引用,因爲它是每個對象的唯一東西。

如果你想建立一個新的列表,你可以使用列表理解:

a = [[0] * 2 for _ in range(3)] 

一般是不是好的做法使用*給出的列表包含可變對象

對於像boolstr這工作,因爲你對象本身上不工作不變的對象,但由此產生的陣列上。在你的例子中你使用了鏈接索引,所以你修改了內部列表。