← Назад к вопросам

Чем отличается copy от deepcopy?

1.0 Junior🔥 131 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Copy vs Deepcopy в Python

Copy и deepcopy — это два разных способа создания копий объектов в Python. Они отличаются тем, как они обрабатывают вложенные объекты и структуры данных.

Shallow Copy (поверхностное копирование)

Copy создаёт поверхностную копию объекта. Это означает, что создаётся новый объект, но содержащиеся в нём ссылки на другие объекты копируются как ссылки, а не как сами объекты.

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)

# Изменяем вложенный список
shallow[0][0] = 999

print(original)  # [[999, 2, 3], [4, 5, 6]]
print(shallow)   # [[999, 2, 3], [4, 5, 6]]

Видно, что изменение вложенного списка повлияло на оригинальный объект. Это потому, что shallow и original ссылаются на одни и те же внутренние объекты.

Deep Copy (глубокое копирование)

Deepcopy создаёт глубокую копию объекта. Она рекурсивно копирует не только сам объект, но и все вложенные объекты, на которые он ссылается.

import copy

original = [[1, 2, 3], [4, 5, 6]]
deep = copy.deepcopy(original)

# Изменяем вложенный список
deep[0][0] = 999

print(original)  # [[1, 2, 3], [4, 5, 6]]
print(deep)      # [[999, 2, 3], [4, 5, 6]]

Теперь оригинальный объект не изменился, потому что deep ссылается на полностью независимые копии всех вложенных объектов.

Практический пример для Data Engineer

В контексте обработки данных это особенно важно:

import copy

# Исходные данные
data_source = {
    "user_1": {"scores": [100, 200, 300], "name": "Alice"},
    "user_2": {"scores": [50, 75, 100], "name": "Bob"}
}

# Поверхностная копия
data_shallow = copy.copy(data_source)
data_shallow["user_1"]["scores"].append(400)

print(data_source["user_1"]["scores"])  # [100, 200, 300, 400] — изменился!

# Глубокая копия
data_deep = copy.deepcopy(data_source)
data_deep["user_1"]["scores"].append(500)

print(data_source["user_1"]["scores"])  # [100, 200, 300, 400] — не изменился

Ключевые отличия:

  • Copy (shallow): создаёт новый объект верхнего уровня, но вложенные объекты остаются теми же ссылками
  • Deepcopy: создаёт полностью независимую копию со всеми вложенными объектами
  • Производительность: deepcopy медленнее, особенно для больших и сложных структур данных
  • Память: deepcopy требует больше памяти для хранения независимых копий

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

Shallow copy — когда вы знаете, что работаете с простыми структурами или вам нужна быстрая копия, и изменения вложенных объектов не должны повлиять на оригинал.

Deep copy — когда у вас сложные вложенные структуры (например, словари со списками словарей) и вам нужна полная независимость исходных данных от копии. В работе с данными это критично при подготовке тестовых наборов или при работе с трансформацией данных в ETL-процессах.

Альтернативы для Data Engineer

Для работы с табличными данными часто используются библиотеки, которые имеют собственные методы копирования:

import pandas as pd

# DataFrame имеет собственный метод copy()
df_original = pd.DataFrame({"col1": [1, 2, 3], "col2": [4, 5, 6]})
df_copy = df_original.copy()  # shallow copy по умолчанию
df_deep = df_original.copy(deep=True)  # deep copy

Это важно понимать при работе с Pandas, так как неправильное копирование может привести к неожиданным изменениям исходных данных.