Python踩坑:列表中使用乘号复制多个空列表的问题

如下代码:

>>> 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], [], []]

你可能感兴趣的:(Python,python)