Skip to content

Latest commit

 

History

History
84 lines (63 loc) · 3.58 KB

File metadata and controls

84 lines (63 loc) · 3.58 KB

Копирование обьектов


Модуль copy. Функции copy.copy и copy.deepcopy

Создать копию объекта можно при помощи 2 способов, использовать срез [:], или метод .copy() методы работают по разному, но эффект от них одинаков, и по времени исполнения они действуют одинаково.

Копирование может происходить 2 способами, при помощи обычного метода obj.copy() который есть у всех структур данных, так и при помощи спец модуля copy у которого есть спец метод copy.copy(obj) оба метода работают одинаково, их способ копирования называется shallow copy


2 метода копирования shallow copy и deep copy

Когда происходит обычное копирование структуры, то копирование происходит способом shallow copy этот метод копирует только верхний слой, то есть только самую первую вложенность, но если в структуре есть вложенная структура, то ссылка на нее остается старой.

Вот пример:

    import copy

    print('Использование обычного copy:')
    my_list_1 = [1, 2, 3, 4, 5, [1,2,3]]

    # my_list_2 = my_list_1.copy()
    my_list_2 = copy.copy(my_list_1)

    print('До изменения')
    print(f'my_list_1 : {my_list_1}')
    print(f'my_list_2 : {my_list_2}')

    print('\nИзменение')
    print('my_list_2[0] = 555')
    print('my_list_2[5][0] = 777\n')
    my_list_2[0] = 555
    my_list_2[5][0] = 777

    print('\nПосле изменения')
    print(f'my_list_1 : {my_list_1}')
    print(f'my_list_2 : {my_list_2}')

    # Вывод
    
    # Использование обычного copy:
    # До изменения
    # my_list_1 : [1, 2, 3, 4, 5, [1, 2, 3]]
    # my_list_2 : [1, 2, 3, 4, 5, [1, 2, 3]]
    
    # Изменение
    # my_list_2[0] = 555
    # my_list_2[5][0] = 777
    
    # После изменения
    # my_list_1 : [1, 2, 3, 4, 5, [777, 2, 3]]
    # my_list_2 : [555, 2, 3, 4, 5, [777, 2, 3]]

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

Чтобы сделать полную копию всех обьектов структуры со всей степенью вложенности, следует использовать метод deepcopy модуля copy


Модуль copy

Предоставляет 2 метода для копирования:

  1. copy.copy(obj) - поверхностное копирование.
  2. copy.deepcopy(obj) - глубокое рекурсивное копирование со всей степенью вложенности.