首页 > 解决方案 > 使用字典理解后更新字典值

问题描述

我可以在使用 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

标签: pythondjango

解决方案


您绝对可以更新,因为构造的对象没有区别。这里的问题是所有键都将同一个字典对象作为值引用,而不是具有(可能)相同数据的不同对象。

因此,您可以使用以下方法制作字典的副本:

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

推荐阅读