有没有办法更新字典而不更改任何包含的可变类型?

时间:2013-05-24 19:00:16

标签: python dictionary immutability

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

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中的引用保持不变?

1 个答案:

答案 0 :(得分: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}}