kopiëren in Python (Deep Copy en Shallow Copy)

kopiëren in Python (Deep Copy en Shallow Copy)

In Python , Toewijzingsinstructies kopiëren geen objecten, ze creëren bindingen tussen een doel en een object. Wanneer wij gebruik maken van de = operator, het creëert alleen een nieuwe variabele die de referentie van het originele object deelt. Om echte kopieën of klonen van deze objecten te maken, kunnen we de kopieermodule gebruiken Python .

Syntaxis van Python Deepcopy

Syntaxis: kopie.deepcopy(x)

Syntaxis van Python Shallowcopy

Syntaxis: kopie.kopie(x)



Voorbeeld:

Om deze kopieën te maken maken wij gebruik van de kopieermodule. Copy() retourneert een oppervlakkige kopie van de lijst, en deepcopy() retourneert een diepe kopie van de lijst. Zoals je kunt zien, hebben beide dezelfde waarde, maar verschillende ID's.

Voorbeeld: Deze code toont het gebruik van de copy> module om zowel ondiepe als diepe kopieën van een geneste lijst te maken li1> . Een oppervlakkig exemplaar, li2> , is gemaakt met behulp van copy.copy()> , waarbij de structuur op het hoogste niveau behouden blijft, maar verwijzingen naar de binnenste lijsten worden gedeeld. Een diepe kopie, li3> , is gemaakt met behulp van copy.deepcopy()> , resulterend in een volledig onafhankelijke kopie van li1> , inclusief alle geneste elementen. De code drukt de ID's en waarden af ​​van li2> En li3> , waarbij het onderscheid tussen oppervlakkige en diepe kopieën wordt benadrukt in termen van referentie en onafhankelijkheid.

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

Uitgang:

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

Wat is Deep Copy in Python?

Bij een diepe kopie wordt een nieuw samengesteld object gemaakt voordat er op recursieve wijze kopieën van de items uit het origineel in worden ingevoegd. Het betekent eerst een nieuw verzamelobject construeren en dit vervolgens recursief vullen met kopieën van de onderliggende objecten die in het origineel voorkomen. Bij deep copy wordt een kopie van het object naar een ander object gekopieerd. Het betekent dat enige veranderingen gemaakt naar een kopie van het object weerspiegelen niet in het originele object.

Diepe kopie in Python

Voorbeeld:

In het bovenstaande voorbeeld is dit de wijziging die in de lijst is aangebracht had geen invloed andere lijsten, wat aangeeft dat de lijst diep gekopieerd is.

Deze code illustreert het diep kopiëren van een lijst met geneste elementen met behulp van de copy> module. Het drukt in eerste instantie de originele elementen af li1> en kopieert ze vervolgens diep om te maken li2> . Een wijziging van een element in li2> heeft geen invloed li1> , zoals blijkt uit de afzonderlijke afdrukken. Dit benadrukt hoe diep kopiëren een onafhankelijke kopie creëert, waarbij de inhoud van de originele lijst behouden blijft, zelfs na wijzigingen in de kopie.

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

Uitgang:

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 

Wat is ondiepe kopie in Python?

Een ondiepe kopie creëert een nieuw samengesteld object en verwijst vervolgens naar de objecten die zich in het origineel bevinden, wat betekent dat er een nieuw verzamelobject wordt geconstrueerd en dit vervolgens wordt gevuld met verwijzingen naar de onderliggende objecten die in het origineel zijn gevonden. Het kopieerproces herhaalt zich niet en maakt daarom geen kopieën van de onderliggende objecten zelf. Bij een oppervlakkige kopie wordt een referentie van een object naar een ander object gekopieerd. Het betekent dat enige veranderingen gemaakt naar een kopie van een object reflecteren wel in het oorspronkelijke voorwerp. In Python wordt dit geïmplementeerd met behulp van de kopiëren() functie.

Ondiepe kopie in Python

Voorbeeld:

In dit voorbeeld de wijziging die in de lijst is aangebracht had invloed een andere lijst, wat aangeeft dat de lijst oppervlakkig is gekopieerd. Belangrijke punten: Het verschil tussen ondiep en diep kopiëren is alleen relevant voor samengestelde objecten (objecten die andere objecten bevatten, zoals lijsten of klasseninstanties):

  • Een ondiepe kopie construeert een nieuw samengesteld object en voegt er vervolgens (voor zover mogelijk) verwijzingen in naar de objecten die in het origineel voorkomen.
  • Een diepe kopie construeert een nieuw samengesteld object en voegt vervolgens recursief kopieën in van de objecten die in het origineel voorkomen.

Voorbeeld: Deze code demonstreert het oppervlakkig kopiëren van een lijst met geneste elementen met behulp van de ' copy'> module. In eerste instantie worden de originele elementen afgedrukt li1> , voert vervolgens oppervlakkig kopiëren uit naar li2> . Een element wijzigen in li2> beïnvloedt het overeenkomstige element in li1,> aangezien beide lijsten verwijzingen naar de binnenste lijsten delen. Dit illustreert dat oppervlakkig kopiëren een nieuwe lijst creëert, maar geen volledige onafhankelijkheid biedt voor geneste elementen.

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

Uitgang:

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

AANBEVOLEN ARTIKELEN Verschil tussen ondiepe en diepe kopie van een klasse



Top Artikelen

Categorie

Interessante Artikelen