Python setdefault附加到每个键
使用setdefault方法时,我会得到奇怪的结果:Python setdefault附加到每个键,python,dictionary,Python,Dictionary,使用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&qu
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?
谢谢 看看:
values = initialize_dict(keys, [])
这里发生了什么:
- initialize_dict由两个列表调用:一个用于键,一个用于默认值
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
从副本导入副本
def初始化命令(患者,默认值):
d={}
住院病人:
d、 setdefault(patient,copy(default))#您总是将相同的列表添加到不同的词典条目中。fwiw使用dict.fromkeys(key,[])
或defaultdict(list)
@python这两个词非常不同<“代码>从键”
将作为OP的代码,defaultdict方法更有意义。若要创建列表的(浅层)副本,请在其上附加[:]
。@python\u否,“dict.fromkeys”对每个键使用相同的值对象。它执行原始代码所执行的操作,但不执行它应该执行的操作。