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)
将引用同一实例的指针推入列表。本质上,您最终会得到一个列表,其中每个元素都指向同一个实例。因此,更新其中一个(在您的情况下是最后一个)会更新所有指针指向的实例,导致它看起来像是更改了所有其他值,而实际上它们是同一个对象。
一个简单的解决方法是每次都创建一个新的字典实例,方法是将其设为函数 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'])
我正在尝试创建一个包含 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)
将引用同一实例的指针推入列表。本质上,您最终会得到一个列表,其中每个元素都指向同一个实例。因此,更新其中一个(在您的情况下是最后一个)会更新所有指针指向的实例,导致它看起来像是更改了所有其他值,而实际上它们是同一个对象。
一个简单的解决方法是每次都创建一个新的字典实例,方法是将其设为函数 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'])