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

В чем разница между Copy и DeepCopy в Python?

2.0 Middle🔥 201 комментариев
#Python

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

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

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

Разница между Copy и DeepCopy в Python

Введение

В Python при работе со сложными структурами данных часто возникает необходимость создавать копии объектов. Встроенный модуль copy предоставляет две основные функции: copy() (поверхностное копирование) и deepcopy() (глубокое копирование). Выбор между ними критичен для корректной работы с данными, особенно в машинном обучении и анализе данных.

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

Функция copy() создаёт новый объект, но внутри него остаются ссылки на исходные вложенные объекты. Новый объект содержит копии только верхнего уровня.

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(original)
shallow_copy[0][0] = 999

print(f"Original: {original}")      # [[999, 2, 3], [4, 5, 6]]
print(f"Shallow copy: {shallow_copy}")  # [[999, 2, 3], [4, 5, 6]]

Как видите, изменение вложенного элемента повлияло на оба объекта!

Глубокое копирование (DeepCopy)

Функция deepcopy() рекурсивно копирует все уровни вложенности. Каждый вложенный объект копируется независимо.

import copy

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

print(f"Original: {original}")      # [[1, 2, 3], [4, 5, 6]]
print(f"Deep copy: {deep_copy}")    # [[999, 2, 3], [4, 5, 6]]

Теперь исходный объект остался нетронутым!

Практические различия

Copy:

  • Быстрее (выполняет меньше операций)
  • Занимает меньше памяти
  • Опасен при работе с вложенными структурами
  • Подходит для простых типов данных

DeepCopy:

  • Медленнее (рекурсивный процесс)
  • Требует больше памяти
  • Безопасен для сложных структур
  • Необходим для DataFrame и словарей с вложенными объектами

Применение в Data Science

import pandas as pd
import copy

df_original = pd.DataFrame({'A': [1, 2, 3], 'B': [[10, 20], [30, 40], [50, 60]]})
df_shallow = copy.copy(df_original)
df_deep = copy.deepcopy(df_original)

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

  • copy() — для простых типов, когда уверены в отсутствии вложенности
  • deepcopy() — при работе с вложенными структурами, DataFrame, моделями ML

Неправильный выбор может привести к трудноуловимым багам в pipeline обработки данных.