introduktion
i den här handledningen kommer vi att diskutera grunda kopior vs djupa kopior med hjälp av exempel i Python. Vi kommer att täcka definitionen av en djup och grund kopia, tillsammans med dess genomförande i Python-språket för att utvärdera kärnskillnaderna mellan de två typerna av kopior.
i många av de program som vi skriver, oavsett hur grundläggande de är, slutar vi att behöva kopiera en lista eller ett objekt av en av många skäl, som beräkningseffektivitet., Det finns två sätt att göra det, antingen göra en djup kopia eller en grund kopia. Innan vi diskuterar skillnaderna mellan de två, låt oss först förstå vilka djupa och grunda kopior exakt är.
djupa kopior i Python
en djup kopia gör en ny och separat kopia av ett helt objekt eller en lista med sin egen unika minnesadress. Vad detta innebär är att eventuella ändringar du gör i den nya kopian av objektet / listan inte kommer att återspegla i den ursprungliga. Denna process sker genom att först skapa en ny lista eller objekt, följt av rekursivt kopiera elementen från den ursprungliga till den nya.,
för att uttrycka det kortfattat är båda objekten helt oberoende av varandra. Detta liknar konceptet att passera efter värde på språk som C++, Java och C#.
exempel på Djupkopiering
för att implementera konceptet djupa kopior i Python använder vi kopieringsmodulen.
låt oss säga att vi har en lista med listor som heter result_A
, som innehåller betyg av student a i 3 ämnen för de första två åren av skolan, och vi vill skapa en exakt liknande lista över resultat för student B också., Vi ska försöka göra en djup kopia av listan result_A
och göra några ändringar i den djupa kopian senare för att visa betygen för student B.
exempel 1:
i skriptet ovan använder vi metoden deepcopy
från modulen copy
för att kopiera lista result_A
. Därefter skriver vi ut innehållet i båda listorna på skärmen.
utgång:
, ], ]
som du kan se är listorna identiska. Senare i den här artikeln ser vi hur detta skiljer sig från grunda kopior.,
grunda kopior i Python
en grund kopia gör också ett separat nytt objektobjekt eller-lista, men istället för att kopiera underelementen till det nya objektet kopierar det helt enkelt referenserna till deras minnesadresser. Därför, om du gör en förändring i det ursprungliga objektet, skulle det reflektera i det kopierade objektet och vice versa. För att uttrycka det kort är båda kopiorna beroende av varandra. Detta liknar konceptet att passera genom referens i programmeringsspråk som C++, C# och Java.,
Grunt Kopieringsexempel
för att implementera detta i Python använder vicopy
– modulen igen, men den här gången ringer vi desscopy
– funktion.
låt oss använda samma exempellista för det grunda kopieringsexemplet också.
exempel 2:
# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)
i skriptet ovan använder vi metodencopy
från modulencopy
för att göra en grund kopia av listanresult_A
som vi namngavresult_B
., Därefter har innehållet i båda listorna skrivits ut på konsolen.
utgång:
, ], ]
igen är listorna desamma, som förväntat. Därefter förklarar vi skillnaden mellan resultaten vi får från funktionernacopy
ochdeepcopy
.
skillnad mellan djupa och grunda kopior
nu när vi har diskuterat vilka grunda och djupa kopior som är och varför vi skapar kopior är det dags att prata om skillnaden mellan dem., I huvudsak finns det bara två kärnskillnader och de är kopplade till varandra:
- Deep copy lagrar kopior av ett objekts värden, medan grunda kopieringshistorier refererar till den ursprungliga minnesadressen
- Deep copy återspeglar inte ändringar som gjorts till det nya / kopierade objektet i det ursprungliga objektet. medan grunda kopian gör
innan vi går vidare till implementeringen, skulle jag vilja att du föreställer dig det här scenariot. Låt oss säga att två personer vill dela en drink; de har två tomma glasögon och två sugrör., De kan dela denna dryck på två sätt:
- sätt drycken i ett glas och lägg båda stråna i det glaset för att dela
- sätt drycken i båda glasögonen och lägg ett halm i varje glas
det första scenariot är att en grund kopia. Båda variablerna / instanserna pekar / använder samma minnesplats för sin verksamhet. Det andra scenariot är en djup kopia. Båda variablerna / instanserna pekar på / använder två olika minnesplatser för sin verksamhet.,
Jämförelseexempel
för att göra skillnaden tydlig, låt oss använda denna information i våra ovanstående två exempel, som börjar med exempel 1.
ovan skapade vi listan result_A
och gjorde en djup kopia av den som heter result_B
. Låt oss försöka ändra innehållet i result_B
och se om det har någon effekt på innehållet i result_A
.
utgång:
Original List:, ]Deep Copy:, ]
det förväntade resultatet är att den ursprungliga listan förblir oförändrad., Och som du kan se påverkade ändringarna i den djupa kopian inte den ursprungliga listan.
Nu kan vi prova samma sak med exempel 2 – Grunt kopia.
utgång:
Original List:, ]Shallow Copy:, ]
här är det förväntade resultatet att både den ursprungliga listan och kopierade listan ändras efter den enda ändringen. Och som ni kan se, att göra ändringen till den grunda kopian resulterade i att förändringen återspeglas i den ursprungliga listan också.
slutsats
i det här inlägget pratade vi om vad en grund och en djup kopia är och hur vi kan göra dem på Python-språk med hjälp av ”kopiera” – modulen., Vi använde två av dess funktioner, dvs. copy
ochdeepcopy
för att göra grunda respektive djupa kopior. Vidare diskuterade vi de två kärnskillnaderna mellan en grund och en djup kopia, och implementerade också grunt och djupt exemplar i python för att förstå dessa skillnader på ett bättre sätt.