kopi i Python (Deep Copy og Shallow Copy)
I Python , Oppdragssetninger kopierer ikke objekter, de skaper bindinger mellom et mål og et objekt. Når vi bruker = operatør, Den oppretter bare en ny variabel som deler referansen til det opprinnelige objektet. For å lage ekte kopier eller kloner av disse objektene kan vi bruke kopimodulen i Python .
Syntaks for Python Deepcopy
Syntaks: copy.deepcopy(x)
Syntaks for Python Shallowcopy
Syntaks: copy.copy(x)
Eksempel:
For å lage disse kopiene bruker vi kopimodulen. Copy() returnerer en grunn kopi av listen, og deepcopy() returnerer en dyp kopi av listen. Som du kan se at begge har samme verdi, men har forskjellige IDer.
Eksempel: Denne koden viser bruken av copy> modul for å lage både grunne og dype kopier av en nestet liste li1> . En grunn kopi, li2> , er opprettet ved hjelp av copy.copy()> , bevare toppnivåstrukturen, men dele referanser til de indre listene. En dyp kopi, li3> , er opprettet ved hjelp av copy.deepcopy()> , noe som resulterer i en helt uavhengig kopi av li1> , inkludert alle nestede elementer. Koden skriver ut IDene og verdiene til li2> og li3> , som fremhever skillet mellom grunne og dype kopier når det gjelder referanse og uavhengighet.
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)> |
Produksjon:
li2 ID: 2521878674624 Value: [1, 2, [3, 5], 4] li3 ID: 2521878676160 Value: [1, 2, [3, 5], 4]
Hva er Deep copy i Python?
En dyp kopi oppretter et nytt sammensatt objekt før kopier av gjenstandene som finnes i originalen settes inn i det på en rekursiv måte. Det betyr først å konstruere et nytt samlingsobjekt og deretter rekursivt fylle det med kopier av de underordnede objektene som finnes i originalen. Ved dyp kopi kopieres en kopi av objektet til et annet objekt. Det betyr at noen endringer laget til en kopi av objektet ikke reflekteres i det originale objektet.
Eksempel:
I eksemplet ovenfor, endringen gjort i listen ikke påvirket andre lister, noe som indikerer at listen er dypt kopiert.
Denne koden illustrerer dyp kopiering av en liste med nestede elementer ved hjelp av copy> modul. Den skriver først ut de originale elementene av li1> , deretter dypkopier dem for å lage li2> . En modifikasjon av et element i li2> påvirker ikke li1> , som vist i de separate utskriftene. Dette fremhever hvordan dyp kopiering skaper en uavhengig kopi, og bevarer innholdet i den originale listen selv etter endringer i kopien.
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> => ' '> )> |
Produksjon:
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
Hva er Shallow copy i Python?
En grunn kopi oppretter et nytt sammensatt objekt og refererer deretter til objektene som finnes i originalen i det, noe som betyr at det konstruerer et nytt samlingsobjekt og deretter fyller det med referanser til de underordnede objektene som finnes i originalen. Kopieringsprosessen gjentar seg ikke og vil derfor ikke lage kopier av underordnede objekter selv. Ved grunne kopier kopieres en referanse til et objekt til et annet objekt. Det betyr at noen endringer laget til en kopi av et objekt reflektere i det opprinnelige objektet. I python implementeres dette ved hjelp av kopiere() funksjon.
Eksempel:
I dette eksemplet er endringen gjort i listen påvirket en annen liste, som indikerer at listen er grunt kopiert. Viktige punkter: Forskjellen mellom grunn og dyp kopiering er bare relevant for sammensatte objekter (objekter som inneholder andre objekter, som lister eller klasseforekomster):
- En grunn kopi konstruerer et nytt sammensatt objekt og setter deretter (i den grad det er mulig) inn referanser til objektene som finnes i originalen.
- En dyp kopi konstruerer et nytt sammensatt objekt og setter deretter, rekursivt, inn kopier av objektene som finnes i originalen.
Eksempel: Denne koden demonstrerer grunn kopiering av en liste med nestede elementer ved å bruke ' copy'> modul. I utgangspunktet skriver den ut de originale elementene av li1> , og utfører deretter grunn kopiering til li2> . Endre et element i li2> påvirker det tilsvarende elementet i li1,> da begge listene deler referanser til de indre listene. Dette illustrerer at grunn kopiering skaper en ny liste, men det gir ikke fullstendig uavhengighet for nestede elementer.
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> => ' '> )> |
Produksjon:
The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4
ANBEFALT ARTIKLER – Forskjellen mellom grunn og dyp kopi av en klasse