kopiuj w Pythonie (głęboka kopia i płytka kopia)
W Pyton Instrukcje przypisania nie kopiują obiektów, lecz tworzą powiązania pomiędzy celem i obiektem. Kiedy używamy = operator, tworzy jedynie nową zmienną, która ma wspólne odwołanie do oryginalnego obiektu. Aby stworzyć prawdziwe kopie lub klony tych obiektów, możemy skorzystać z modułu kopiowania w Pyton .
Składnia Pythona Deepcopy
Składnia: kopia.głęboka kopia(x)
Składnia Pythona Shallowcopy
Składnia: kopia.kopia(x)
Przykład:
Do wykonania tych kopii wykorzystujemy moduł kopiowania. Funkcja copy() zwraca płytką kopię listy, a deepcopy() zwraca głęboką kopię listy. Jak widać, oba mają tę samą wartość, ale mają różne identyfikatory.
Przykład: Ten kod przedstawia użycie copy> moduł do tworzenia zarówno płytkich, jak i głębokich kopii zagnieżdżonej listy li1> . Płytki egzemplarz, li2> , jest tworzony przy użyciu copy.copy()> , zachowując strukturę najwyższego poziomu, ale udostępniając odniesienia do list wewnętrznych. Głęboki egzemplarz, li3> , jest tworzony przy użyciu copy.deepcopy()> , co daje całkowicie niezależną kopię li1> , łącznie ze wszystkimi zagnieżdżonymi elementami. Kod wypisuje identyfikatory i wartości li2> I li3> , podkreślając różnicę między kopiami płytkimi i głębokimi pod względem odniesienia i niezależności.
Python3
import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'li2 ID: '> ,> id> (li2),> 'Value: '> , li2)> li3> => copy.deepcopy(li1)> print> (> 'li3 ID: '> ,> id> (li3),> 'Value: '> , li3)> |
Wyjście:
li2 ID: 2521878674624 Value: [1, 2, [3, 5], 4] li3 ID: 2521878676160 Value: [1, 2, [3, 5], 4]
Co to jest głęboka kopia w Pythonie?
Głęboka kopia tworzy nowy obiekt złożony przed wstawieniem do niego kopii elementów znalezionych w oryginale w sposób rekurencyjny. Oznacza to najpierw skonstruowanie nowego obiektu kolekcji, a następnie rekurencyjne wypełnienie go kopiami obiektów podrzędnych znalezionych w oryginale. W przypadku głębokiej kopii kopia obiektu jest kopiowana do innego obiektu. To znaczy, że jakieś zmiany wykonane na kopię obiektu nie odbijają się w oryginalnym obiekcie.
Przykład:
W powyższym przykładzie zmiana dokonana na liście nie miało wpływu inne listy, wskazując, że lista została głęboko skopiowana.
Ten kod ilustruje głębokie kopiowanie listy z zagnieżdżonymi elementami przy użyciu metody copy> moduł. Początkowo drukuje oryginalne elementy li1> , a następnie głęboko je kopiuje i tworzy li2> . Modyfikacja elementu w li2> nie ma wpływu li1> jak wynika z odrębnych wydruków. Podkreśla to, jak głębokie kopiowanie tworzy niezależną kopię, zachowując zawartość oryginalnej listy nawet po wprowadzeniu zmian w kopii.
Python3
import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.deepcopy(li1)> print> (> 'The original elements before deep copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> '
'> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The new list of elements after deep copying '> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li2[i],end> => ' '> )> print> (> '
'> )> print> (> 'The original elements after deep copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )> |
Wyjście:
The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4
Co to jest płytka kopia w Pythonie?
Płytka kopia tworzy nowy obiekt złożony, a następnie odwołuje się do obiektów zawartych w oryginale, co oznacza, że konstruuje nowy obiekt kolekcji, a następnie wypełnia go odniesieniami do obiektów podrzędnych znalezionych w oryginale. Proces kopiowania nie jest powtarzalny i dlatego nie tworzy kopii samych obiektów podrzędnych. W przypadku płytkiej kopii odniesienie do obiektu jest kopiowane do innego obiektu. To znaczy, że jakieś zmiany wykonane na kopię obiektu zastanów się w oryginalnym obiekcie. W Pythonie jest to realizowane za pomocą Kopiuj() funkcjonować.
Przykład:
W tym przykładzie zmiana dokonana na liście wpłynęło inną listę, wskazując, że lista została płytko skopiowana. Ważne punkty: Różnica między płytkim i głębokim kopiowaniem dotyczy tylko obiektów złożonych (obiektów zawierających inne obiekty, takie jak listy lub instancje klas):
- Płytka kopia konstruuje nowy obiekt złożony, a następnie (w miarę możliwości) wstawia do niej odniesienia do obiektów znalezionych w oryginale.
- Głęboka kopia konstruuje nowy obiekt złożony, a następnie rekurencyjnie wstawia do niego kopie obiektów znalezionych w oryginale.
Przykład: Ten kod demonstruje płytkie kopiowanie listy z zagnieżdżonymi elementami przy użyciu metody ' copy'> moduł. Początkowo drukuje oryginalne elementy li1> , a następnie wykonuje płytkie kopiowanie do li2> . Modyfikowanie elementu w li2> wpływa na odpowiedni element w li1,> ponieważ obie listy mają wspólne odniesienia do list wewnętrznych. To pokazuje, że płytkie kopiowanie tworzy nową listę, ale nie zapewnia całkowitej niezależności zagnieżdżonych elementów.
Python3
import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'The original elements before shallow copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> '
'> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The original elements after shallow copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )> |
Wyjście:
The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4
POLECANE ARTYKUŁY – Różnica między płytką i głęboką kopią klasy