Ответ
Основное различие между 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() |
|---|---|---|
| Вложенные объекты | Копируются ссылки | Создаются полные копии |
| Независимость | Частичная (только для верхнего уровня) | Полная |
| Производительность | Быстро | Медленнее (из-за рекурсии) |
| Использование | Для простых объектов или когда вложенные объекты неизменяемы (числа, строки, кортежи). | Для сложных структур данных (списки списков, словари с изменяемыми значениями), когда нужна полная изоляция копии. |