Python:字典列表仅在每次迭代中存储最后附加的值

Beg*_*ner 4 python dictionary list

我有这个字典列表:

MylistOfdict = [{'Word': 'surveillance',
  'Word No': 1},
 {'Word': 'equivocal',
  'Word No': 2}]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的字典 ( 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
Run Code Online (Sandbox Code Playgroud)

输出:

{'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'}
Run Code Online (Sandbox Code Playgroud)

这个输出是正确的,但word_db2在每次迭代中只存储最后一个附加值

print(word_db2)
Run Code Online (Sandbox Code Playgroud)

输出:

[{'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}]
Run Code Online (Sandbox Code Playgroud)

Ole*_*nko 5

让我们一步一步回顾一下循环体逻辑:

  1. 采取其中一个口述
  2. 修改它
  3. 将其附加到列表的末尾

因此,您错过的关键点是您修改并附加了在第一步中选择的同一对象。并且在代码段的末尾word_db2包含六个对象引用,但只有两个是唯一的。结果,输出显示了相似的行。

您可以在修改和附加它之前制作一个dict的浅拷贝

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
Run Code Online (Sandbox Code Playgroud)

进一步注意,如果 dict 包含其他可变对象,如嵌套 dicts,则应进行深复制

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
Run Code Online (Sandbox Code Playgroud)