skopiuj do Pythona (Deep Copy i Shallow Copy)

| | | |

Czasami wymagana jest kopia, aby można było zmienić jedną kopię bez zmiany innej. Python ma dwa sposoby tworzenia kopii:

  • Głęboka kopia
  • Płytka kopia

Aby wykonać te kopie, używamy skopiuj moduł . Używamy modułu copy do operacji kopiowania płytkiego i głębokiego. Na przykład


# importuj moduł kopiowania

importuj kopiuj


# zainicjuj listę 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# użyj kopii do płytkiej kopii

li2 = kopiuj.copy ( li1)


# używanie Deepcopy do Deepcopy

li3 < /kod> = copy.deepcopy (li1)

W powyższym kodzie, copy () zwraca płytką kopię listy, a deepcopy () zwraca głęboką kopię listy.

deepcopy

Głębokie kopiowanie — jest to proces, w którym proces kopiowania zachodzi rekurencyjnie. Oznacza to najpierw utworzenie 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. Oznacza to, że wszelkie zmiany wprowadzone w kopii obiektu nie są odzwierciedlane w oryginalnym obiekcie. W pythonie odbywa się to za pomocą funkcji deepcopy() .


# Kod w Pythonie demonstrujący operacje kopiowania


# import & quot; kopiuj & quot; dla operacji kopiowania

importuj kopiuj


# inicjalizacja listy 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# używanie Deepcopy do głębokiego kopiowania

li2 = copy.deepcopy (li1)


# oryginalne elementy listy

print ( "Oryginalne elementy przed głębokim kopiowaniem" )

for i in range ( 0 , len (li1)):

print (li1 [i], end = " " )

print ( " " )


# dodaj i element do nowej listy

li2 [ 2 ] [ 0 ] = 7


# Zmiana jest odzwierciedlona w l2

print ( "Nowa lista elementów po głębokim kopiowaniu " )

for i in zakres ( 0 , len (li1)):

print (li2 [i], end = "" )


print ( "" )


# Zmiana jest NIE odzwierciedlone na oryginalnej liście
# jak głęboka kopia

print ( "Oryginalne elementy po głębokim kopiowaniu" )

for i in zakres ( 0 , len (li1)):

print (li1 [i], end = "" )

Wyjście:

Oryginalny element s przed głębokim kopiowaniem 1 2 [3, 5] 4 Nowa lista elementów po głębokim kopiowaniu 1 2 [7, 5] 4 Oryginalne elementy po głębokim kopiowaniu 1 2 [3, 5] 4 

W w powyższym przykładzie zmiana dokonana na liście nie wpłynęła na inne listy, co wskazuje na głębokie kopiowanie listy.

Płytka kopia

Płytka kopia oznacza utworzenie nowego obiektu kolekcji, a następnie wypełnienie go odniesieniami do znalezionych obiektów podrzędnych w orginale. Proces kopiowania nie powtarza się i dlatego nie tworzy kopii samych obiektów podrzędnych. W przypadku płytkiej kopii odwołanie do obiektu jest kopiowane do innego obiektu. Oznacza to, że wszelkie zmiany wprowadzone do kopii obiektu są odzwierciedlane w oryginalnym obiekcie. Python robi to za pomocą funkcji "copy () ".


# Kod w Pythonie demonstrujący operacje kopiowania


# importuj & quot; kopiuj & quot; dla operacji kopiowania

importuj kopiuj


# inicjalizacja listy 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# użyj kopii do płytkiej kopii

li2 = copy.copy (li1)


# oryginalne pozycje listy

print ( " Oryginalne elementy przed płytkim kopiowaniem " )

for i w zakres ( 0 , len (li1)):

print (li1 [i], end = "" )


print ( "" )


# dodaj i element do nowej listy

li2 [ 2 ] [ 0 ] = 7


# sprawdź, czy zmiana została uwzględniona

print ( "Oryginalne elementy po płytkim kopiowaniu" )

for i in zakres ( 0 , len (li1 )):

print (li1 [i], end = " " )

Wyjście:

Oryginalne elementy przed płytkim kopiowaniem 1 2 [3, 5] 4 Oryginalne elementy po płytkim kopiowaniu 1 2 [7, 5] 4 

W powyższym przykładzie zmiana dokonana na liście to weszło w życie na innej liście, wskazując, że lista została skopiowana.

Ważne punkty:
Różnica między kopiami płytkimi i głębokimi dotyczy tylko obiektów złożonych (obiektów, które zawierają inne obiekty, takie jak listy lub instancje klas):

  • Płytka kopia tworzy nowy obiekt złożony, a następnie (o ile to możliwe) wstawia odniesienia do obiektów znalezionych w oryginale.
  • Głęboka kopia tworzy nowy obiekt złożony, a następnie rekurencyjnie wstawia do niego kopie obiektów znalezionych w oryginale.