kopiera i Python (Deep Copy och Shallow Copy)

kopiera i Python (Deep Copy och Shallow Copy)

I Pytonorm , Tilldelningssatser kopierar inte objekt, de skapar bindningar mellan ett mål och ett objekt. När vi använder = operator, Den skapar bara en ny variabel som delar referensen för det ursprungliga objektet. För att skapa riktiga kopior eller kloner av dessa objekt kan vi använda kopieringsmodulen i Pytonorm .

Syntax för Python Deepcopy

Syntax: copy.deepcopy(x)

Syntax för Python Shallowcopy

Syntax: copy.copy(x)



Exempel:

För att göra dessa kopior använder vi kopieringsmodulen. Copy() returnerar en ytlig kopia av listan, och deepcopy() returnerar en djup kopia av listan. Som du kan se att båda har samma värde men har olika ID.

Exempel: Denna kod visar användningen av copy> modul för att skapa både grunda och djupa kopior av en kapslad lista li1> . En grund kopia, li2> , skapas med hjälp av copy.copy()> , bevara toppnivåstrukturen men dela referenser till de inre listorna. En djup kopia, li3> , skapas med hjälp av copy.deepcopy()> , vilket resulterar i en helt oberoende kopia av li1> , inklusive alla kapslade element. Koden skriver ut ID:n och värden för li2> och li3> , som lyfter fram skillnaden mellan grunda och djupa kopior när det gäller referens och oberoende.

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)>

Produktion:

  li2 ID:   2521878674624   Value:   [1, 2, [3, 5], 4]   li3 ID:   2521878676160   Value:   [1, 2, [3, 5], 4] 

Vad är Deep copy i Python?

En djup kopia skapar ett nytt sammansatt objekt innan kopior av objekten som finns i originalet infogas i det på ett rekursivt sätt. Det innebär att först konstruera ett nytt samlingsobjekt och sedan rekursivt fylla det med kopior av de underordnade objekten som finns i originalet. Vid djupkopiering kopieras en kopia av objektet till ett annat objekt. Det betyder att några ändringar gjort till en kopia av föremålet reflekteras inte i originalobjektet.

Djupkopia i Python

Exempel:

I exemplet ovan, ändringen i listan inte påverkade andra listor, vilket indikerar att listan är djupt kopierad.

Den här koden illustrerar djupkopiering av en lista med kapslade element med hjälp av copy> modul. Den skriver initialt ut de ursprungliga delarna av li1> , sedan djupkopior dem för att skapa li2> . En modifiering av ett element i li2> påverkar inte li1> , vilket framgår av de separata utskrifterna. Detta framhäver hur djupkopiering skapar en oberoende kopia, och bevarar originallistans innehåll även efter ändringar av kopian.

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> => ' '> )>

Produktion:

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 

Vad är Shallow copy i Python?

En grund kopia skapar ett nytt sammansatt objekt och refererar sedan till objekten som finns i originalet i det, vilket innebär att det konstruerar ett nytt samlingsobjekt och sedan fyller det med referenser till de underordnade objekten som finns i originalet. Kopieringsprocessen återkommer inte och kommer därför inte att skapa kopior av de underordnade objekten själva. I fallet med ytlig kopia kopieras en referens av ett objekt till ett annat objekt. Det betyder att några ändringar gjort till en kopia av ett objekt reflektera i originalobjektet. I python implementeras detta med hjälp av kopiera() fungera.

Grund kopia i Python

Exempel:

I det här exemplet, ändringen i listan påverkade en annan lista, vilket indikerar att listan är ytlig kopierad. Viktiga punkter: Skillnaden mellan ytlig och djup kopiering är endast relevant för sammansatta objekt (objekt som innehåller andra objekt, som listor eller klassinstanser):

  • En grund kopia konstruerar ett nytt sammansatt objekt och infogar sedan (i den mån det är möjligt) referenser i det till objekten som finns i originalet.
  • En djup kopia konstruerar ett nytt sammansatt objekt och infogar sedan rekursivt kopior i det av objekten som finns i originalet.

Exempel: Den här koden visar ytlig kopiering av en lista med kapslade element med hjälp av ' copy'> modul. Inledningsvis skriver den ut de ursprungliga delarna av li1> , utför sedan ytlig kopiering till li2> . Ändra ett element i li2> påverkar motsvarande element i li1,> eftersom båda listorna delar referenser till de inre listorna. Detta illustrerar att ytlig kopiering skapar en ny lista, men det ger inte fullständigt oberoende för kapslade element.

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> => ' '> )>

Produktion:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4 

REKOMMENDERADE ARTIKLAR Skillnaden mellan grund och djup kopia av en klass



Top Artiklar

Kategori

Intressanta Artiklar