Изменение значения из вложенного словаря в Python

Я просто пытаюсь изменить значение из вложенного словаря.

Первый словарь пуст, а второй заполнен. Когда я пытаюсь изменить значение одного из элементов вложенного словаря, также было изменено значение с тем же ключом других элементов.

name = dict()
work = {"hour" : 4, "age":21}

name['bob'] = work
name['harry'] = work

name['bob']['hour'] = 7

Теперь я получаю это, если печатаю новый словарь name:

{'bob': {'hour': 7, 'age': 21}, 'harry': {'hour': 7, 'age': 21}}

Я хотел бы иметь такую ​​​​ситуацию:

{'bob': {'hour': 7, 'age': 21}, 'harry': {'hour': 4, 'age': 21}}

Почему он меняет час из словаря harry?


person Enrico Mosca    schedule 05.05.2020    source источник
comment
Используйте name['bob'] = work.copy() и name['harry'] = work.copy(). Будет передана ссылка, а не значение.   -  person jizhihaoSAMA    schedule 05.05.2020
comment
Оба они являются ссылками на одно и то же значение. Вы захотите скопировать его.   -  person Kenny Ostrom    schedule 05.05.2020


Ответы (2)


Это связано с тем, что оба имени относятся к одному и тому же элементу, т. е. относятся к одному и тому же значению. Вы должны скопировать dict вместо простого присваивания, как показано ниже:

name = dict()
work = {"hour" : 4, "age":21}

name['bob'] = work.copy()
name['harry'] = work.copy()

name['bob']['hour'] = 7
person David    schedule 05.05.2020
comment
вам не нужно импортировать copy для поверхностного копирования - person Gabip; 05.05.2020

Проблема в том, что вы назначаете тот же самый объект, который вы определили ранее.

Попробуйте использовать dict copy:

name = dict()
work = {"hour" : 4, "age":21}

name['bob'] = work.copy()
name['harry'] = work.copy()

name['bob']['hour'] = 7

Если бы work был вложенным словарем, вам пришлось бы использовать deepcopy (copy создает поверхностную копию, которая не копирует вложенные структуры):

from copy import deepcopy
name['bob'] = deepcopy(work)
name['harry'] = deepcopy(work)
person Gabip    schedule 05.05.2020