比方說,我有以下代碼:Python列表混亂
a_list = [[0]*10]*10
這會產生以下列表:
[[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],
[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],
[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],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
然後我想修改的第一個元素在第一列表:
a_list[0][0] = 23
我預計只有列表的第一個元素被修改,但實際上每個列表的第一個元素被改變了:
[[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[23, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
我設法找到另一種方式來表示我的數據,以避免這種情況,但爲什麼會發生這種情況?爲什麼不只是第一個列表發生了變化?當我做第二個*10
時,Python是否真的複製了第一個列表的地址,而不是分配一個新的內存塊?
您的懷疑是正確的。 – 2011-05-10 22:47:20
「名單混淆」是「名單理解」中鮮爲人知的雙胞胎嗎? ;) – 2011-05-10 22:56:46