07 Июл 2023
2 мин
48

Почему обновление «поверхностной» копии словаря не обновляет «оригинальный» словарь?

При работе с Python, важно понимать, как работают копии. Существуют два типа копий: поверхностные (shallow) и глубокие (deep). Поверхностная копия создает новую

Содержание

При работе с Python, важно понимать, как работают копии. Существуют два типа копий: поверхностные (shallow) и глубокие (deep). Поверхностная копия создает новую коллекцию с ссылками на элементы оригинала, в то время как глубокая копия создает новую коллекцию и рекурсивно копирует все элементы оригинала.

Встретимся со следующей ситуацией. Допустим, есть словарь, и нужно создать его копию и добавить новый элемент в эту копию. Затем ожидается, что этот новый элемент появится и в оригинальном словаре. Но на самом деле это не происходит.

original = dict(a=1, b=2)
new = original.copy()
new.update({'c': 3})

После выполнения этого кода, в словаре new будет три элемента: 'a': 1, 'b': 2, 'c': 3, а в original — только два: 'a': 1, 'b': 2.

Это происходит потому, что метод dict.copy() создает поверхностную копию словаря. Поверхностная копия означает, что создается новый словарь, и в этот новый словарь копируются ссылки на объекты из оригинального словаря. Поэтому, когда в копию добавляется новый элемент, он добавляется только в копию, а не в оригинал, поскольку копия и оригинал — это два разных объекта.

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

Таким образом, для изменения копии и оригинала одновременно, необходимо использовать глубокую копию. Но в случае со словарями Python, глубокая копия не поддерживается напрямую, и для ее создания следует использовать модуль copy:

import copy
original = dict(a=1, b=2)
new = copy.deepcopy(original)
new.update({'c': 3})

Содержание

Добавить комментарий

Узнай профессию по рисунку