当使用setdefault方法时,我得到了奇怪的结果:
def initialize_dict(patients, default):
d = {}
for patient in patients:
d.setdefault(patient, default)
return d
keys = ["A", "B"]
values = initialize_dict(keys, [])
values["A"].append(1)
values
{'A': [1], 'B': [1]}为什么在"A“和"B”后面加上1?谢谢!
发布于 2020-11-10 12:02:21
看:
values = initialize_dict(keys, [])这里发生了什么:
调查:
def initialize_dict(patients, default):
d = {}
for patient in patients:
d.setdefault(patient, default)
return d您所做的就是获取默认值并将其赋值给键。但是,请注意,始终只有一个列表被创建!换句话说,相同的列表被赋值为d["A"]和d["B"]的值--或者更好的是,它们都指向内存中的同一个对象。因此,修改d["A"]会改变d["B"]的值。
为了避免这种情况,一个解决方案是复制默认值。
from copy import copy
def initialize_dict(patients, default):
d = {}
for patient in patients:
d.setdefault(patient, copy(default)) # << HERE!
return d注意,默认情况下,copy.copy会执行一个浅拷贝。根据您想要做的事情,您可能需要使用copy.deepcopy
最后,正如其他人所说的,这是违约的一个很好的适合/用例。
https://stackoverflow.com/questions/64768476
复制相似问题