Articles

Python Płytka Kopia i głęboka Kopia


kopiowanie obiektu w Pythonie

w Pythonie używamy operatora = do tworzenia kopii obiektu. Może się wydawać, że tworzy to nowy obiekt, ale nie tworzy. tworzy tylko nową zmienną, która dzieli odniesienie do oryginalnego obiektu.

weźmy przykład, w którym tworzymy Listę o nazwie old_list i przekazujemy odniesienie obiektu do new_list za pomocą operatora=.,

przykład 1: Copy using = operator

Kiedy uruchomimy powyższy program, wyjście będzie następujące:

Old List: , , ]ID of Old List: 140673303268168New List: , , ]ID of New List: 140673303268168

Jak widać z wyjścia obie zmienne old_list i new_list mają ten sam IDENTYFIKATOR TJ140673303268168.

tak więc, jeśli chcesz zmodyfikować jakieś wartości w new_list lub old_list, zmiana jest widoczna w obu.

zasadniczo, czasami możesz chcieć, aby oryginalne wartości były niezmienione i modyfikować tylko nowe wartości lub odwrotnie., W Pythonie istnieją dwa sposoby tworzenia kopii:

  1. Płytka Kopia
  2. głęboka Kopia

aby te kopie działały, używamy modułu copy.

moduł kopiowania

używamy modułucopy Pythona do płytkich i głębokich operacji kopiowania. Załóżmy, że musisz skopiować listę złożoną X. na przykład:

import copycopy.copy(x)copy.deepcopy(x)

tutaj copy() zwraca płytką kopię x. podobnie deepcopy() zwraca głęboką kopię x.,

Płytka Kopia

płytka Kopia tworzy nowy obiekt, który przechowuje odniesienia do oryginalnych elementów.

tak więc płytka Kopia nie tworzy kopii zagnieżdżonych obiektów, zamiast tego po prostu kopiuje odniesienia do zagnieżdżonych obiektów. Oznacza to, że proces kopiowania nie rekurencyjnie ani nie tworzy kopii zagnieżdżonych obiektów.,

przykład 2: Utwórz kopię używając shallow copy

import copyold_list = , , ]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)

Kiedy uruchomimy program , wyjście będzie następujące:

Old list: , , ]New list: , , ]

w powyższym programie utworzyliśmy zagnieżdżoną listę, a następnie shallow skopiowaliśmy ją używając copy() metoda.

oznacza to, że utworzy nowy i niezależny obiekt o tej samej zawartości. Aby to zweryfikować, drukujemy zarówno old_list jak i new_list.,

aby potwierdzić, że new_list różni się od old_list, staramy się dodać nowy zagnieżdżony obiekt do oryginału i sprawdzić go.

przykład 3: dodanie do old_list, użycie shallow copy

Kiedy uruchomimy program, wyświetli się:

Old list: , , , ]New list: , , ]

w powyższym programie utworzyliśmy shallow copy of old_list. New_list zawiera odniesienia do oryginalnych zagnieżdżonych obiektów przechowywanych w old_list. Następnie dodajemy nową listę tj. do old_list., Ta nowa sublista nie została skopiowana w new_list.

jednak, gdy zmienisz dowolne zagnieżdżone obiekty w old_list, zmiany pojawią się w new_list.

przykład 4: dodanie nowego zagnieżdżonego obiektu przy użyciu płytkiej kopii

import copyold_list = , , ]new_list = copy.copy(old_list)old_list = 'AA'print("Old list:", old_list)print("New list:", new_list)

gdy uruchomimy program, wyświetli się:

Old list: , , ]New list: , , ]

głęboka Kopia

głęboka Kopia tworzy nowy obiekt i rekurencyjnie dodaje kopie zagnieżdżonych obiektów obecnych w oryginalnych elementach.

kontynuujmy przykład 2., Jednak zamierzamy utworzyć głęboką kopię za pomocą deepcopy() funkcja obecna wcopy moduł. Głęboka Kopia tworzy niezależną kopię oryginalnego obiektu i wszystkich jego zagnieżdżonych obiektów.

przykład 5: kopiowanie listy za pomocą metody deepcopy ()

import copyold_list = , , ]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)

gdy uruchomimy program, wyświetli się:

Old list: , , ]New list: , , ]

w powyższym programie używamy funkcjideepcopy() do tworzenia kopii, która wygląda podobnie.,

Jeśli jednak zmienisz dowolne zagnieżdżone obiekty w oryginalnym obiekcie old_list, nie zobaczysz żadnych zmian w Kopiuj new_list.

przykład 6: dodanie nowego zagnieżdżonego obiektu na liście za pomocą głębokiej kopii

Kiedy uruchomimy program, wyświetli się:

Old list: , , ]New list: , , ]

w powyższym programie, kiedy przypisujemy nową wartość do old_list, widzimy, że tylko old_list jest modyfikowana. Oznacza to, że zarówno old_list, jak i new_list są niezależne. Dzieje się tak dlatego, że old_list został rekurencyjnie skopiowany, co jest prawdą dla wszystkich zagnieżdżonych obiektów.