Понимание мелкой и глубокой копии в Python

Пока я работал над python, я попытался скопировать список в новую переменную с помощью оператора «=». Внеся несколько изменений, я понял, что в Python это неправильный способ.

Через несколько секунд я просматривал несколько статей, понимая, что при копировании данных в Python используются две терминологии: неглубокая и глубокая копия.

Оператор = не копирует объект, он просто создает новую переменную и использует ссылку на исходную переменную.

Примечание: все приведенные ниже примеры были взяты из python-engineering и programiz.

list_a = [1, 2, 3, 4, 5]
list_b = list_a

list_a[0] = -10
print(list_a)
print(list_b)

Нам должно быть интересно, что print (list_a) будет выводить [-10, 2, 3, 4, 5], поскольку мы внесли изменения в list_a [0] = -10, поэтому 1 был заменен на -10. Тогда мы абсолютно правы.

Но с другой стороны, если мы также думаем, что print (list_b) будет выводить [1, 2, 3, 4, 5], то на этот раз мы полностью ошибаемся. .

Здесь произошло то, что вы выполнили list_b = list_a, он только создал новую переменную с той же ссылкой. Следовательно, изменение одного повлияет на другое. Оба будут выводить то же значение, что и [-10, 2, 3, 4, 5].

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

  1. Мелкая копия
  2. Глубокая копия

Чтобы эти копии работали, мы используем модуль copy.

Использовать этот модуль довольно просто.

import copy
copy.copy(x) # for shallow copy
copy.deepcopy(x) # for deep copy

Вот и все!

Давайте разберемся с этим на нескольких примерах.

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

Мой list_a имеет глубину всего 1 уровня, поэтому изменение list_b не повлияет на list_a.

Но с вложенными объектами изменение на уровне 2 или выше влияет на другие!

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

Глубокая копия, создающая независимую копию исходного объекта и всех его вложенных объектов.

Сообщите мне, если у вас возникнут трудности в комментариях.