В чем разница между copy() и deepcopy()

Глубокая копия deepcopy() создает новую и отдельную копию всего объекта или списка со своим уникальным адресом памяти. Это означает, что любые изменения, внесенные вами в новую копию объекта или списка, не будут отражаться в исходной. Этот процесс происходит следующим образом: сначала создается новый список или объект, а затем рекурсивно копируются все элементы из исходного в новый.

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

Oct. 10, 2023, Источник

Функции `copy()` и `deepcopy()` используются для создания копий объектов, но есть существенная разница в том, как они копируют вложенные объекты.

1. `copy()`:

  • Создает поверхностную копию объекта. Это означает, что копируется только сам объект и его первый уровень вложенных объектов, но не их вложенные объекты.
  • Если вы измените вложенные объекты в исходном объекте, эти изменения будут отражены и в его копии, так как они оба будут ссылаться на одни и те же вложенные объекты.
  • Используется, когда вам нужна поверхностная копия объекта, и вы уверены, что вложенные объекты не будут изменяться.

2. `deepcopy()`:

  • Создает глубокую копию объекта. Это означает, что копируются как сам объект, так и все его вложенные объекты, рекурсивно, до тех пор, пока не будут скопированы все объекты внутри объекта.
  • Глубокая копия полезна, когда вам нужно создать копию объекта, включая все его вложенные объекты, и вы не хотите, чтобы изменения в исходном объекте отражались на его копии и наоборот.
  • Однако глубокие копии могут быть более затратными по памяти и времени, особенно если объект содержит много вложенных объектов.

Пример использования `copy()` и `deepcopy()`:

import copy

original_list = [1, [2, 3], 4]

shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

original_list[1][0] = 5  # Изменение вложенного списка

print(original_list)    # Вывод: [1, [5, 3], 4]
print(shallow_copy)     # Вывод: [1, [5, 3], 4]
print(deep_copy)        # Вывод: [1, [2, 3], 4]

В этом примере `shallow_copy` является поверхностной копией `original_list`, а `deep_copy` — глубокой копией. При изменении вложенного списка в `original_list` это отражается на `shallow_copy`, но не на `deep_copy`.

Feb. 19, 2024, easyoffer