Ответ
Основное различие между 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 сойдёт. Главное — понимать, что ты делаешь, а не тыкать наугад, как мартышлюшка.