Чем отличаются copy.copy() и copy.deepcopy() в Python

Ответ

Основное различие между copy.copy() и copy.deepcopy() заключается в том, как они обрабатывают вложенные объекты.

  • copy.copy() (поверхностное копирование): Создает новый объект, но вставляет в него ссылки на объекты, найденные в оригинале. Вложенные изменяемые объекты не копируются, а остаются общими для оригинала и копии.

  • copy.deepcopy() (глубокое копирование): Создает новый объект и рекурсивно копирует все вложенные в него объекты. Копия становится полностью независимой от оригинала.

Наглядный пример

import copy

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

# Создаем поверхностную и глубокую копии
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

# Изменяем вложенный список в оригинале
original_list[0][0] = 99

print(f"Оригинал: {original_list}")
# Изменение отразилось в поверхностной копии
print(f"Поверхностная копия: {shallow_copy}")
# Глубокая копия осталась неизменной
print(f"Глубокая копия: {deep_copy}")

# Вывод:
# Оригинал: [[99, 2], [3, 4]]
# Поверхностная копия: [[99, 2], [3, 4]]
# Глубокая копия: [[1, 2], [3, 4]]

Когда что использовать

Характеристика copy.copy() copy.deepcopy()
Вложенные объекты Копируются ссылки Создаются полные копии
Независимость Частичная (только для верхнего уровня) Полная
Производительность Быстро Медленнее (из-за рекурсии)
Использование Для простых объектов или когда вложенные объекты неизменяемы (числа, строки, кортежи). Для сложных структур данных (списки списков, словари с изменяемыми значениями), когда нужна полная изоляция копии.