В чем разница между copy() и deepcopy() в Python?

«В чем разница между copy() и deepcopy() в Python?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

copy() создает поверхностную (shallow) копию объекта. Копируются только ссылки на вложенные изменяемые объекты (например, списки внутри списка), поэтому изменения во вложенных объектах оригинала отразятся на копии.

deepcopy() создает глубокую копию, рекурсивно копируя сам объект и все объекты, на которые он ссылается, создавая полностью независимую копию.

Пример, демонстрирующий разницу:

import copy

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

# Изменяем вложенный список в оригинале
original[0][0] = 99

print(shallow)  # [[99, 2], [3, 4]] - изменился, так как ссылается на тот же вложенный список
print(deep)     # [[1, 2], [3, 4]] - не изменился, это полностью независимая копия

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

  • copy() — когда объект содержит только неизменяемые элементы (числа, строки, кортежи) или когда вам намеренно нужно разделять вложенные изменяемые данные. Работает быстрее.
  • deepcopy() — когда необходимо создать полную, независимую клон-копию сложного объекта со вложенными списками, словарями и т.д. Требует больше ресурсов.