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

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

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

deepcopy() медленнее copy(), так как требует больше ресурсов.

Разница между copy() и deepcopy() в Python заключается в способе копирования объектов, особенно когда эти объекты содержат вложенные объекты (например, списки внутри списков или объекты, содержащие другие объекты).

copy() (или поверхностное копирование):

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

Пример:


import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)

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

print(original_list)  # Вывод: [1, 2, [5, 4]] - original_list тоже изменился!
print(shallow_copy)  # Вывод: [1, 2, [5, 4]]
    

deepcopy() (или глубокое копирование):

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

Пример:


import copy

original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)

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

print(original_list)  # Вывод: [1, 2, [3, 4]] - original_list остался без изменений!
print(deep_copy)  # Вывод: [1, 2, [5, 4]]
    

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

  • copy() подходит, когда вам нужно создать копию объекта, но вложенные объекты могут быть общими (например, когда изменение вложенных объектов в копии должно отражаться в оригинале или наоборот). Это также более эффективный с точки зрения производительности, чем deepcopy().
  • deepcopy() подходит, когда вам нужна полностью независимая копия объекта и всех его вложенных объектов, чтобы изменения в копии не влияли на оригинал и наоборот. Используйте deepcopy(), когда у вас есть сложные структуры данных, и вы не хотите нежелательных побочных эффектов при изменении копий.

Вкратце: copy() копирует только верхний уровень объекта, а deepcopy() копирует все уровни объекта рекурсивно.

0