Редактировать одну часть вложенного списка в dict - PullRequest
2 голосов
/ 13 января 2020

Когда я запускаю следующий код в Python:

# create empty dummy dict
lst = [[0] for _ in range(2)]
dummy_dict = {'a': lst, 'b': lst}

# create dummy list
x_dummy = [1,2,3]

dummy_dict['a'][0] = x_dummy
print(dummy_dict)

, я получаю этот вывод для dummy_dict:

{'a': [[1, 2, 3], [0]], 'b': [[1, 2, 3], [0]]}

Почему я не получаю

{'a': [[1, 2, 3], [0]], 'b': [[0], [0]]}

и как мне этого добиться?

1 Ответ

0 голосов
/ 13 января 2020

Поскольку вы обновляете только один из ключей словаря, значения обоих ключей указывают на один и тот же объект:

id(dummy_dict['a'])
# 1752793882440

id(dummy_dict['b'])
# 1752793882440

, следовательно, все изменения этого изменяемого объекта будут отражено в других ссылках на него.

Вот фиктивный пример, где вы можете видеть, что изменение одного из внутренних списков списка не создает новый объект, так как списки, как упоминалось, mutable

a = [[1,2,3], [0]]
id(a)
# 1752794665032

a[1] = [2]
id(a)
# 752794665032

Решение

Вместо этого установите значения словаря с копиями списка (полный фрагмент копирует содержимое списка )

dummy_dict = {k:lst[:] for k in ['a', 'b']}
dummy_dict['a'][0] = x_dummy
print(dummy_dict)
# {'a': [[1, 2, 3], [0]], 'b': [[0], [0]]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...