Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setdefault附加到每个键_Python_Dictionary - Fatal编程技术网

Python 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

使用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? 谢谢

看看:

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”对每个键使用相同的值对象。它执行原始代码所执行的操作,但不执行它应该执行的操作。