python - 使用字典理解后更新字典值
问题描述
我可以在使用 for 循环初始化嵌套字典后更新嵌套字典,但在使用字典理解后不能。这是为什么 ?
这有效:
def calendar_init(year, month, habits):
date_list = dates_in_month(year, month)
calendar_init = dict()
for mydate in date_list:
calendar_init[mydate] = {'mood': None}
for habit in habits:
calendar_init[mydate][habit] = None
return calendar_init
def create_calendar(year, month, habits, entries, moods):
new_calendar = calendar_init(year, month, habits)
for entry in entries:
new_calendar[entry.day][entry.habit] = entry
for mood in moods:
new_calendar[mood.day]['mood'] = mood
return new_calendar
但这不是:
def calendar_init(year, month, habits):
date_list = dates_in_month(year, month)
merged_dict = {**dict.fromkeys(habits, None), **{'mood': None}}
calendar_init = {mydate: merged_dict for mydate in date_list}
return calendar_init
def create_calendar(year, month, habits, entries, moods):
new_calendar = calendar_init(year, month, habits)
for entry in entries:
new_calendar[entry.day][entry.habit] = entry
for mood in moods:
new_calendar[mood.day]['mood'] = mood
return new_calendar
解决方案
您绝对可以更新,因为构造的对象没有区别。这里的问题是所有键都将同一个字典对象作为值引用,而不是具有(可能)相同数据的不同对象。
因此,您可以使用以下方法制作字典的副本:
def calendar_init(year, month, habits):
date_list = dates_in_month(year, month)
merged_dict = {**dict.fromkeys(habits, None), **{'mood': None}}
calendar_init = {mydate: dict(merged_dict) for mydate in date_list}
return calendar_init
推荐阅读
- android - 我试图将我的颤振应用程序与 firebase 连接起来,但我发现了这个错误
- mysql - 使用 SQL JOIN,如何将一张表的结果限制为最近的记录
- reactjs - 在对输入变量做出反应时使用状态的最佳方法是什么?
- python - Python:将字典列表转换为 JSON 对象
- r - 如何使用引用列名的循环在 r 中执行乘法?
- python - 可以使用旋转矩阵进行无缝克隆吗?
- python - 对 N 维 numpy 数组执行过滤
- python - 在python上列出索引超出范围
- python - Django 在每个请求上执行几乎所有的 .py 文件
- angular - Angular Fire 和 Firebase 模拟器 - 文档更新不起作用