Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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, так как неправильное копирование может привести к неожиданным изменениям исходных данных.