Шаг 66.
Python: тонкости программирования.
Классы и ООП. Клонирование объектов (общие сведения)

    На этом шаге мы рассмотрим особенности выполнения присваивания.

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

    Но для работы с изменяемыми объектами или коллекциями изменяемых объектов вам, возможно, стоит найти способ создания "реальных копий", или "клонов", этих объектов.

    По существу, вам иногда будут требоваться копии, которые можно модифицировать без автоматической модификации оригинала. В этом разделе мы кратко представим то, как копировать, или "клонировать", объекты в Python, и покажем связанные с этим подводные камни.

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

new_list = list(original_list) 
new_dict = dict(original_dict) 
new_set = set(original_set)

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

    Мелкая копия (shallow copy) означает конструирование нового объекта-коллекции и затем его заполнение ссылками на дочерние объекты, найденные в оригинале. В сущности, мелкая копия имеет всего один уровень в глубину. Процесс копирования выполняется нерекурсивно и поэтому не создает копий самих дочерних объектов.

    Глубокая копия (deep copy) выполняет процесс копирования рекурсивно. Это означает конструирование сначала нового объекта коллекции, а затем рекурсивное его заполнение копиями дочерних объектов, найденных в оригинале. При копировании объекта таким способом выполняется обход всего дерева объектов целиком, и создается полностью независимый клон исходного объекта и всех его потомков.

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

    На следующем шаге мы рассмотрим создание мелких копий.




Предыдущий шаг Содержание Следующий шаг