Обновление значения словаря после использования словарного понимания - PullRequest
1 голос
/ 01 марта 2020

Я могу обновить вложенный словарь после его инициализации, используя для l oop, но не после использования словаря. Почему это так?

Это работает:

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 Ответ

1 голос
/ 01 марта 2020

Вы определенно можете обновить, так как нет разницы в построенном объекте. Проблема здесь в том, что все ключи ссылаются на один и тот же объект словаря как значения, а не на разные объекты с (возможно) одинаковыми данными.

Таким образом, вы можете создавать копии словаря с помощью:

def calendar_init(year, month, habits):
    date_list = dates_in_month(year, month)
    merged_dict = {**dict.fromkeys(habits, None), **{'mood': None}}
    calendar_init = {mydate: <b>dict(</b>merged_dict<b>)</b> for mydate in date_list}
    return calendar_init
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...