我创建了如下的嵌套字典,其中包含空值,以便稍后更新。
categ_list = ['cat_a','cat_b']
sub_ = {'sub_1': '', 'sub_2': ''}
m_dict = dict.fromkeys(categ_list, sub_)
在上级
上使用细循环迭代更新值i =0
for cat_ in categ_list:
i +=1
m_dict[cat_]['sub_1'] = 'hi ' + cat_
m_dict[cat_]['sub_2'] = i
在打印时,我发现它没有像我期望的那样更新,所以我得到
{'cat_a': {'sub_1': 'hi cat_b', 'sub_2': 2}, 'cat_b': {'sub_1': 'hi cat_b', 'sub_2': 2}}
when I was expected
{'cat_a': {'sub_1': 'hi cat_a', 'sub_2': 1}, 'cat_b': {'sub_1': 'hi cat_b', 'sub_2': 2}}
Where's issue &如何修复?
正如文档所述,它将值(这里是sub_
)放入每个键,每个键点放入相同且唯一的字典,因此第二次循环迭代覆盖第一次
所有的值都指向一个单独的实例,所以value作为一个可变对象通常是没有意义的
要正确构建它,使用dict-comprehension
并复制sub_
字典
categ_list = ['cat_a', 'cat_b']
sub_ = {'sub_1': '', 'sub_2': ''}
m_dict = {k: sub_.copy() for k in categ_list}
正如评论中提到的,该值实际上是copy
。所以你需要换不同的变量。一个简单的方法是使用json
模块
import json
categ_list = ['cat_a','cat_b']
sub_ = {'sub_1': '', 'sub_2': ''}
m_dict = dict.fromkeys(categ_list, sub_)
# here is the hack
m_dict = json.loads(json.dumps(m_dict))
i =0
for cat_ in categ_list:
i +=1
m_dict[cat_]['sub_1'] = 'hi ' + cat_
m_dict[cat_]['sub_2'] = i
print(m_dict)
{'cat_a': {'sub_1': 'hi cat_a', 'sub_2': 1}, 'cat_b': {'sub_1': 'hi cat_b', 'sub_2': 2}}
注意:首选的方法是用azro来回答。