Понимание поверхностного копирования и глубокого копирования в Python: объяснение на примерах

В Python при работе с объектами и структурами данных нам часто приходится создавать копии для различных целей. Двумя наиболее часто используемыми подходами являются поверхностное копирование и глубокое копирование. В этой статье мы углубимся в концепции поверхностного и глубокого копирования, изучим их различия и предоставим примеры кода для иллюстрации каждого метода. Давайте начнем!

  1. Поверхностное копирование.
    Поверхностное копирование — это процесс создания нового объекта, ссылающегося на исходные данные. Он создает новый объект-контейнер, но не дублирует элементы внутри контейнера. Изменения, внесенные в исходный объект, отразятся на скопированном объекте, и наоборот. Вот пример:
import copy
original_list = [1, 2, 3, [4, 5]]
shallow_copy = copy.copy(original_list)
original_list[3].append(6)
print(original_list)    # Output: [1, 2, 3, [4, 5, 6]]
print(shallow_copy)     # Output: [1, 2, 3, [4, 5, 6]]
  1. Глубокое копирование.
    С другой стороны, глубокое копирование создает полностью независимую копию исходного объекта и его содержимого. Любые изменения, внесенные в исходный объект, не повлияют на скопированный объект, и наоборот. Вот пример:
import copy
original_list = [1, 2, 3, [4, 5]]
deep_copy = copy.deepcopy(original_list)
original_list[3].append(6)
print(original_list)   # Output: [1, 2, 3, [4, 5, 6]]
print(deep_copy)       # Output: [1, 2, 3, [4, 5]]
  1. Нарезка.
    В Python вы также можете использовать нарезку для создания неглубокой копии объектов, таких как списки, кортежи или строки. Нарезка создает новый объект с новой ссылкой на память. Вот пример:
original_list = [1, 2, 3, [4, 5]]
sliced_copy = original_list[:]
original_list[3].append(6)
print(original_list)   # Output: [1, 2, 3, [4, 5, 6]]
print(sliced_copy)     # Output: [1, 2, 3, [4, 5, 6]]
  1. Модуль копирования.
    Встроенный модуль copyPython предоставляет функции как для поверхностного, так и для глубокого копирования. Мы уже видели примеры copy.copy()и copy.deepcopy(), но модуль также предоставляет функцию copy(), которая выполняет поверхностное копирование. Вот пример:
import copy
original_list = [1, 2, 3, [4, 5]]
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)
original_list[3].append(6)
print(original_list)   # Output: [1, 2, 3, [4, 5, 6]]
print(shallow_copy)    # Output: [1, 2, 3, [4, 5, 6]]
print(deep_copy)       # Output: [1, 2, 3, [4, 5]]

Понимание концепций мелкого и глубокого копирования в Python имеет решающее значение при работе с объектами и структурами данных. При поверхностном копировании создается новый объект, ссылающийся на исходные данные, а при глубоком копировании создается независимая копия. Нарезка и модуль copyпредоставляют дополнительные методы копирования объектов. Используя эти методы копирования, вы можете манипулировать и изменять данные, не затрагивая исходные объекты.

Поняв разницу между поверхностным и глубоким копированием, вы сможете обеспечить целостность своих данных и избежать непредвиденного поведения в своих программах Python.