在需要多个空dict时,我们可以使用语法:[{}]*n 来复制出数组中包含n个空dict的内容,如复制3个空dict到数组中:
>>> [{}]*3
[{}, {}, {}]
从结果看,的确复制了三个空字典,但是我们在对其分别赋值时,会出现对第一个dict操作,后面所有的内容都被赋予同样内容的问题。
>>> d = [{}]*3
[{}, {}, {}]
>>> d[0]['name'] = 'python'
>>> d
[{'name': 'python'}, {'name': 'python'}, {'name': 'python'}]
那么问题出在哪呢?这是因为使用乘号(*)复制时,只是复制了三个索引,即复制的n个索引都指向同一个物理地址,所以我们在操作其中任何一个时,都会同时修改其他内容。
要避免该问题,必须要对每个dict单独定义,即每个dict单独拥有一块内存空间,所以可以如下方法解决:
>>> n = 3
... d = []
... while n > 0:
... d.append({})
... n -= 1
>>> d
[{}, {}, {}]
>>> d[0]['name'] = 'python'
>>> d
[{'name': 'python'}, {}, {}]