Шаг 68.
Python: тонкости программирования.
Классы и ООП. Клонирование объектов. Создание глубоких копий

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

    Давайте повторим предыдущий пример с копированием списка, но с одним важным различием. В этот раз мы собираемся создать глубокую копию, используя вместо встроенной фабричной функции функцию deepcopy(), определенную в модуле copy:

>>> import copy
>>> xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> zs = copy.deepcopy(xs)

    Когда вы проинспектируете список xs и его клон zs, созданный нами с помощью copy.deepcopy(), вы увидите, что они оба снова выглядят идентичными - точно так же, как и в предыдущем примере:

>>> xs
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> zs
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

    Однако если вы внесете модификацию в один из дочерних объектов в оригинальном объекте (xs), то вы увидите, что эта модификация не затронет глубокую копию (zs).

    Оба объекта, оригинал и копия, на этот раз полностью независимы. Список xs был клонирован рекурсивно, включая все его дочерние объекты:

>>> xs[1][0] = 'X'
>>> xs
[[1, 2, 3], ['X', 5, 6], [7, 8, 9]]
>>> zs
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

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

    Между прочим, при помощи функции в модуле copy вы также можете создавать мелкие копии. Функция copy.copy() создает мелкие копии объектов.

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

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




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