使用字典理解后更新字典值

时间:2020-03-01 17:49:25

标签: python django

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

1 个答案:

答案 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