繁体   English   中英

Python - 创建包含多个具有相同键名和不同值的字典的新列表

[英]Python - create new list containing multiple dictionaries with the same key name and different value

我正在尝试创建一个包含 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

很明显我在这里遗漏了一些东西

问候,伊佐

之所以看起来每个元素的字典都与最后更新的值相关联,是因为它们都是同一个实例。 这是因为:

template = [
    {'holder': None,},
]

包含运行这些代码行时创建的相同字典实例。 以及您对数组的扩展:

event.extend(template)

将引用同一实例的指针推入列表。 本质上,您最终会得到一个列表,其中每个元素都指向同一个实例。 因此,更新其中一个(在您的情况下是最后一个)会更新所有指针指向的实例,导致它看起来像是更改了所有其他值,而实际上它们是相同的 object。

一个简单的修复方法是每次都通过将其设为 function 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'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM