[英]Updating dictionary value after using dictionary comprehension
我可以在使用 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.