我正在尝试创建一个包含n个字典的新列表,每个字典具有相同的键但不同的值,这有一个非常具体的用例,所以我最初的想法是:
template = [
{'holder': None,},
]
event = []
for entry in range(0,4):
event.extend(template)
event[entry]['holder'] = "Mock-Value-" + str(entry)
print(event[entry]['holder'])
print()
for item in event:
print(item['holder'])
根据上面的代码,我期望:
Mock-Value-0
Mock-Value-1
Mock-Value-2
Mock-Value-3
Mock-Value-0
Mock-Value-1
Mock-Value-2
Mock-Value-3
但是我得到了以下内容:
Mock-Value-0
Mock-Value-1
Mock-Value-2
Mock-Value-3
Mock-Value-3
Mock-Value-3
Mock-Value-3
Mock-Value-3
很明显,我在这里遗漏了一些东西
问候,Yitzo
似乎每个元素的字典都与最近更新的值相关联的原因是因为它们都是相同的实例。这是因为:
template = [
{'holder': None,},
]
保存的dictionary实例与运行这两行代码时创建的dictionary实例相同。数组的扩展:
event.extend(template)
将引用同一实例的指针压入列表。实际上,最终得到的是一个列表,其中每个元素都指向同一个实例。因此,更新其中一个(在您的例子中是最后一个)会更新所有指针所指向的实例,导致看起来它改变了所有其他值,而实际上它们是同一个对象。
一个简单的修复方法是每次创建一个新的字典实例,将其改为函数get_template
:
get_template = lambda: [
{'holder': None,},
]
event = []
for entry in range(0,4):
event.extend(get_template())
event[entry]['holder'] = "Mock-Value-" + str(entry)
print(event[entry]['holder'])
print()
for item in event:
print(item['holder'])