比方说,我有以下代码: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