@Torsionov

Как правильно заполнять словарь словарями?

Приветствую! Не могу понять почему не правильно заполняется словарь с вложенными словарями из функции:

Создаю его так
def build_table(_list, _list2, x):
    table = {i:{} for i in _list}
    for i in _list:
        table[i] = {s:x for s in _list2}
    return table

table =  build_table(['ALL', 'NOT ALL'], ['A', 'B'], {})
table
#Вывод: {'ALL': {'A': {}, 'B': {}}, 'NOT ALL': {'A': {}, 'B': {}}}


Делаю такой же вручную
table_1 = {'ALL': {'A': {}, 'B': {}}, 'NOT ALL': {'A': {}, 'B': {}}}
table == table_1
#Вывод: True


Заполняю значениями из списка
list_to_fill = [['ALL', 'A', 'aaaa', 111], ['ALL', 'B', 'bbb', 222]]
for row in list_to_fill:
    table[row[0]][row[1]][row[2]] = row[3]
    table_1[row[0]][row[1]][row[2]] = row[3]


Получаю разные словари:
table
#Вывод: {'ALL': {'A': {'aaaa': 111, 'bbb': 222}, 'B': {'aaaa': 111, 'bbb': 222}},
 'NOT ALL': {'A': {'aaaa': 111, 'bbb': 222}, 'B': {'aaaa': 111, 'bbb': 222}}}

table_1
#Вывод: {'ALL': {'A': {'aaaa': 111}, 'B': {'bbb': 222}}, 'NOT ALL': {'A': {}, 'B': {}}}


Почему такое происходит? Как исправить? Пробовал вставлять везде в функции deepcopy(), но не помогло
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
"Вручную" создается не то же самое.
"Автоматически" у вас ссылка на один и тот же словарь копируется в разные места словаря многократно.
А "вручную" разные словари в разных местах. Они равны, но они не одно и то же.
Ради интересу запустите
table = build_table(['ALL', 'NOT ALL'], ['A', 'B'], {1: 1})
и увидите, что получится.

А потом запустите
table['ALL']['A'][1] = 2
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы