首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setdefault附加到每个键

setdefault附加到每个键
EN

Stack Overflow用户
提问于 2020-11-10 11:55:02
回答 1查看 35关注 0票数 0

当使用setdefault方法时,我得到了奇怪的结果:

代码语言:javascript
复制
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?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-10 12:02:21

看:

代码语言:javascript
复制
values = initialize_dict(keys, [])

这里发生了什么:

  • 调用initialize_dict时有两个列表:一个用于键,一个用于,一个用于默认值

调查:

代码语言:javascript
复制
def initialize_dict(patients, default):
    d = {}
    for patient in patients:
        d.setdefault(patient, default)
    return d

您所做的就是获取默认值并将其赋值给键。但是,请注意,始终只有一个列表被创建!换句话说,相同的列表被赋值为d["A"]d["B"]的值--或者更好的是,它们都指向内存中的同一个对象。因此,修改d["A"]会改变d["B"]的值。

为了避免这种情况,一个解决方案是复制默认值。

代码语言:javascript
复制
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

最后,正如其他人所说的,这是违约的一个很好的适合/用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64768476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档