如下代码:
>>> a = [[]] * 3
>>> b = []
>>> for i in range(3):
... b.append([])
>>> a == b
True
>>> a
[[], [], []]
>>> b
[[], [], []]
从上面结果看,[[]] * 3
确实是创建了一个 [[], [], []]
的空列表,但是我们在赋值的时候就会出现以下出乎意料的情况:
>>> a[0].append(1)
>>> b[0].append(1)
>>> a == b
False
>>> a
[[1], [1], [1]]
>>> b
[[1], [], []]
探究其原因是因为使用乘号*
复制时,只是复制了索引,即复制的n个索引都指向同一个物理地址,所以在操作其中任何一个时,都会同时修改其他内容。同理列表中多个空字典也是同样的问题。
优雅的解决这个问题(借助列表推导式):
>>> a = [[] for i in range(3)]
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [], []]