【问题标题】:Is there a way to update a dictionary without changing any contained mutable types? [duplicate]有没有办法在不更改任何包含的可变类型的情况下更新字典? [复制]
【发布时间】:2013-05-20 11:08:13
【问题描述】:

我有一本这种结构的设置字典:

main_dict = {
    'a': {
        'a1': 1,
        'a2': 2,
    },
    'b': {
        'bb': {
            'bb1' : 1,
            'bb2' : 2,
        },
    },
}

然后我有一些类包含对 main_dict 中包含的字典的引用,例如:

class B:
    def __init__(self, settings):
        self.settings = settings

my_b = B(main_dict['b'])
assert(my_b.settings is main_dict['b'])

所以我可以更新main_dict 中的不可变值,这些更新将反映在my_b 中,因为my_b.settings is main_dict['b']

但是,我现在有一个新的根字典,其中包含新的设置,结构相同:

new_dict = {
    'a': {
        'a1': 11,
        'a2': 22,
    },
    'b': {
        'bb': {
            'bb1' : 11,
            'bb2' : 22,
        },
    },
}

是否有一种简单且通用的方法可以将new_dict 中的所有不可变值复制到main_dict 中,从而使 my_b 中的引用保持不变?

【问题讨论】:

  • @MartijnPieters,我很确定他想确保字典完全一样。就像通过引用而不是按值传递一样
  • @TehTris:不,OP 想要将所有嵌套字典值复制到现有字典中。您可以通过递归更新来做到这一点,如另一个问题所示。
  • 形状(对象图中字典的出现次数,以及所有字典键的集合)是否相同?
  • 虽然我的问题比那个问题稍微笼统一些(我关心的是保留确切的实例以及防止main_dict 中的值丢失,而new_dict 中没有),我认为给出的答案非常接近这里所需要的。感谢您找到它。
  • @delnan 不总是,不。我们可能会加载一个不完整的设置文件,在这种情况下,main_dict 中的某些元素将保持未更新。 (我们也可能在new_dict 中有额外的数据,这些数据将被插入到main_dict

标签: python dictionary immutability


【解决方案1】:

这会有帮助吗?

#!/usr/bin/env python3

def copyimmut(fromdict, todict):
    for key in fromdict:
        if type(fromdict[key]) is dict and key in todict:
            copyimmut(fromdict[key], todict[key])
        else:
            todict[key] = fromdict[key]

main_dict = {
    'a': {'a1': 1, 'a2': 2},
    'b': {'bb': {'bb1' : 1,'bb2' : 2, }}}

my_b = main_dict['b']
assert(my_b is main_dict['b'])
print(my_b)

new_dict = {
    'a': {'a1': 11, 'a2': 22},
    'b': {'bb': {'bb1' : 11, 'bb2' : 22, }},
    'c': {'cc': {'cc1' : 11, 'cc2' : 22, }}}

copyimmut(new_dict, main_dict)
assert(my_b is main_dict['b'])
print(my_b)
print(main_dict['c'])

产量

{'bb': {'bb1': 1, 'bb2': 2}}
{'bb': {'bb1': 11, 'bb2': 22}}
{'cc': {'cc2': 22, 'cc1': 11}}

【讨论】:

  • 谢谢!差不多 - 但是,如果您看到 stackoverflow.com/a/14048316/794283 ,如果 fromdict[key] 是 dict 而 todict[key] 不是,则存在边界情况会导致问题。
  • 当然,我没有包括错误检查或边缘情况处理,因为我不知道在您的情况下会发生哪些情况。在你所说的情况下应该怎么办?
  • 在这种情况下,将在 main_dict 中创建一个新元素
  • 请看我的更新。
  • 感谢@uselpa,我认为可能还有一个极端情况,其中 fromdict[key] 是一个字典,但 todict[key] 不是需要查看的字典 - 但很清楚如何查看做这个。递归ftw - 它比我预期的要简单;)
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 2022-11-29
  • 2011-12-26
  • 2021-01-16
  • 2019-12-09
  • 2013-01-30
  • 2015-08-11
  • 2021-08-18
相关资源
最近更新 更多