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

Ответ 18+ 🔞

А, ну вот, блядь, классика! Сидишь такой, пишешь код, всё вроде пиздато, а потом — бац! — и оказывается, что ты на самом деле не скопировал, а просто натыкал ссылок, как мудак последний. Так что слушай сюда, сейчас разжую, в чём разница между 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()
Что с вложенностями? Только ссылки кидает Рекурсивно всё клонирует, реальные копии делает
Самостоятельность Фиктивная, только верхний уровень свой Полная, абсолютная, как у одинокого волка
Скорость Быстро, потому что лениво Медленнее, ибо надо в каждую дырку залезть
Когда юзать? Когда объекты простые или вложенности неизменяемые (числа, строки). Когда структура сложная, как мозги у чиновника, и нужна полная изоляция, чтобы одно изменение всё не похерило.

Короче, думай головой, прежде чем копировать. Не хочешь сюрпризов — бери deepcopy. Жалеешь ресурсы и уверен, что ничего не сломается — copy сойдёт. Главное — понимать, что ты делаешь, а не тыкать наугад, как мартышлюшка.