我可以在使用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
答案 0 :(得分:1)
您肯定可以更新,因为构造的对象没有区别。这里的问题是所有键都将 same 字典对象引用为值,而不是(可能)具有相同数据的不同对象。
因此,您可以使用以下方法复制字典:
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