Python:字典列表在每次迭代中仅存储最后附加的值
问题内容:
我有这个字典清单:
MylistOfdict = [{'Word': 'surveillance',
'Word No': 1},
{'Word': 'equivocal',
'Word No': 2}]
我想创建一个新的字典列表(word_db2
),其中的每个字典都有3个字典MylistOfdict
。除了MylistOfdict的键和值之外,这些词典中的每一个都应具有值类型为1,类型2,类型3的“卡类型”键和具有增量值的“卡密钥”键
码:
word_db2 = []
key = 1
for i in MylistOfdict:
for j in range(1, 4):
i['Card Type'] = 'Type '+str(j)
i['Card Key'] = key
print(i)
word_db2.append(i)
key += 1
输出:
{'Word No': 1, 'Card Key': 1, 'Word': 'surveillance', 'Card Type': 'Type 1'}
{'Word No': 1, 'Card Key': 2, 'Word': 'surveillance', 'Card Type': 'Type 2'}
{'Word No': 1, 'Card Key': 3, 'Word': 'surveillance', 'Card Type': 'Type 3'}
{'Word No': 2, 'Card Key': 4, 'Word': 'equivocal', 'Card Type': 'Type 1'}
{'Word No': 2, 'Card Key': 5, 'Word': 'equivocal', 'Card Type': 'Type 2'}
{'Word No': 2, 'Card Key': 6, 'Word': 'equivocal', 'Card Type': 'Type 3'}
此输出是正确的,但word_db2
在每次迭代中仅存储最后附加的值
print(word_db2)
输出:
[{'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
{'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
{'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
{'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2},
{'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2},
{'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2}]
问题答案:
让我们逐步回顾一下循环主体的逻辑:
- 接受其中一项
- 修改它
- 将其附加到列表的末尾
因此,您错过的关键点是您修改并附加了第一步中选择的对象。并且在代码片段的末尾word_db2
包含六个对象引用,但只有两个唯一。结果,输出显示相似的行。
您可以在修改和附加字典之前对其进行 浅表复制 :
for j in range(1, 4):
i = dict(i)
i['Card Type'] = 'Type '+str(j)
i['Card Key'] = key
print(i)
word_db2.append(i)
key += 1
进一步说明,如果dict包含其他可变对象(例如嵌套dict),则应进行 深层复制 :
import copy
old_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
new_dict = copy.deepcopy(old_dict)
old_dict['a'][1] = 7
new_dict['a'][1] # 2