簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM