我有这种结构的设置字典:
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中的引用保持不变?
答案 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}}