Читая документацию для dict.copy()
, он говорит, что делает мелкую копию словаря. То же самое касается книги, которой я следую (Справочник Бизли по Python), в которой говорится:
Метод m.copy () создает поверхностную копию элементов, содержащихся в объекте отображения, и помещает их в новый объект отображения.
Учти это:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Поэтому я предположил, что это обновит значение original
(и добавит 'c': 3) также, так как я делал мелкую копию. Например, если вы делаете это для списка:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Это работает как ожидалось.
Поскольку оба являются мелкими копиями, почему dict.copy()
это не работает, как я ожидаю? Или мое понимание мелкого и глубокого копирования ошибочно?
python
dictionary
copy
user225312
источник
источник
Ответы:
Под "мелким копированием" подразумевается, что содержимое словаря не копируется по значению, а просто создает новую ссылку.
Напротив, глубокая копия будет копировать все содержимое по значению.
Так:
b = a
: Ссылка на назначение, Маркаa
иb
указывает на один и тот же объект.b = a.copy()
: Мелкое копирование,a
иb
он станет двумя изолированными объектами, но их содержимое все еще будет иметь одну и ту же ссылкуb = copy.deepcopy(a)
Глубокое копирование,a
а такжеb
структура и содержание становятся полностью изолированными.источник
L
снова вb
. Это упростит пример.b[1][0] = 5
. Еслиb
это мелкая копия, вы только что изменилисьa[1][0]
.Это не вопрос глубокой или мелкой копии, все, что вы делаете, не является глубокой копией.
Вот:
вы создаете новую ссылку на список / dict, на который ссылается оригинал.
пока здесь:
вы создаете новый список / dict, который заполнен копией ссылок на объекты, содержащиеся в исходном контейнере.
источник
Возьмите этот пример:
Теперь давайте изменим значение на «мелком» (первом) уровне:
Теперь давайте изменим значение на один уровень глубже:
источник
no change in original, since ['a'] is an immutable integer
Эта. Это на самом деле отвечает на заданный вопрос.Добавление к ответу Кеннимма. Когда вы выполняете поверхностное копирование parent.copy (), создается новый словарь с теми же ключами, но значения не копируются, на них ссылаются. Если вы добавите новое значение в parent_copy, это не повлияет на parent, потому что parent_copy - новый словарь не ссылка.
Значение hash (id) parent [1] , parent_copy [1] идентично, что подразумевает [1,2,3] parent [1] и parent_copy [1], хранящиеся с идентификатором 140690938288400.
Но хэш parent и parent_copy различаются, что подразумевает, что это разные словари, а parent_copy - это новый словарь, имеющий значения, ссылающиеся на значения parent
источник
«новый» и «оригинальный» - это разные диктанты, поэтому вы можете обновить только один из них. Элементы копируются мелко, а не сами диктовки.
источник
Содержание мелко скопировано.
Таким образом, если оригинал
dict
содержит одинlist
или другойdictionary
, изменение одного из них в оригинале или его мелкой копии изменит их (list
или илиdict
) в другом.источник
Во второй части вы должны использовать
new = original.copy()
.copy
и=
разные вещи.источник