Forstå Shallow and Deep Copy i Python

Forstå Shallow and Deep Copy i Python
Læsere som dig hjælper med at støtte MUO. Når du foretager et køb ved hjælp af links på vores websted, kan vi optjene en affiliate-kommission. Læs mere.

Python tilbyder flere effektive tilgange til håndtering af data. At forstå overfladiske og dybe kopieringskoncepter er afgørende, når du arbejder med datastrukturer som indlejrede lister, ordbøger eller brugerdefinerede objekter.





MUO Video af dagen RUL FOR AT FORTSÆTTE MED INDHOLD

Både overfladisk og dyb kopi giver dig mulighed for at lave replikaer af datastrukturer, men de virker anderledes med hensyn til indlejrede data.





Brug af Shallow Copy

Overfladisk kopi fungerer ved at skabe en kopi af strukturen på øverste niveau af det originale objekt. Dette betyder, at hvis det originale objekt indeholder indlejrede objekter, vil kopien referere til de samme indlejrede objekter, som originalen gør. Med andre ord, at lave en overfladisk kopi af et objekt dublerer dets yderste struktur, ikke nogen indlejrede objekter, det kan indeholde.





For at udføre en overfladisk kopi i Python kan du bruge kopimodulets kopi() funktion eller .kopi() metode på objektet.

Overvej et eksempel på arbejder med en liste eller ordbog i Python .



import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

I koden ovenfor er hovedliste variabel indeholder en liste, der indeholder heltal og en indre liste (indlejret objekt), der indeholder bogstaver. Kopieringsfunktionen opretter en kopi af hovedliste som koden gemmer i en anden variabel, lavvandet_kopi .

Eventuelle ændringer, du foretager i lavvandet_kopi indlejret liste vil også direkte påvirke den af hovedliste og omvendt. Disse ændringer viser, at den indlejrede eller indre liste over lavvandet_kopi er blot en henvisning til den hovedliste , så ændringerne gælder i hovedliste også.





  ændringer til indlejret liste over lavvandede kopier

I mellemtiden er der foretaget ændringer i de ydre elementer (heltallene) i begge lavvandet_kopi eller hovedliste vil kun påvirke det tilfælde. Disse ydre genstande er uafhængige værdier i deres egen ret, ikke blot blotte referencer.

import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Outputtet viser, at begge listes ydre elementer er uafhængige af hinanden:





  ændringer af ydre elementer af lavt eksemplar

Den samme idé gør sig gældende, når man arbejder med ordbøger.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}} 
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Ændringer foretaget i den indlejrede ordbog af diktat 1 påvirke begge dele diktat 1 og diktat 2 . Samtidig ændres de ydre elementer af diktat 1 kun påvirke det.

  ved at bruge overfladisk kopi med indlejret ordbog

Brug af Deep Copy

I stedet for at henvise til de indlejrede objekter i den originale kopi, laver en dyb kopi en helt separat kopi af det originale objekt og dets indlejrede objekter. Ændring af den dybe kopi vil ikke påvirke det originale objekt og omvendt; de er virkelig separate værdier.

For at lave en dyb kopi i Python skal du bruge deepcopy() kopimodulets funktion.

Overvej et eksempel på at arbejde med en liste.

import copy 

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Her udfører koden en dyb kopi af hovedliste , opretter en uafhængig kopi ved navn dyb_kopi .

Når du ændrer den indlejrede liste eller ydre elementer i dyb_kopi , dine ændringer påvirker ikke den originale liste og omvendt. Dette viser, at den indlejrede liste eller ydre elementer ikke er delt mellem de to kopier.

tips og tricks til samsung galaxy watch
  ved hjælp af dyb kopi med indlejret liste

Arbejde med brugerdefinerede objekter

Du kan oprette et brugerdefineret objekt ved at definere en Python-klasse og oprette en forekomst af klassen.

Her er et eksempel på at skabe et simpelt objekt fra en Bestil klasse:

classBook: 
    def__init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def__str__(self):
        returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Lav nu både en overfladisk kopi og en dyb kopi af en forekomst af dette Bestil klasse ved hjælp af kopi modul.

import copy 

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Som du kan se, er den overfladiske kopi ( bog 2 ) er et nyt objekt, men det refererer til det samme indre objekt (forfatterliste) som det originale objekt ( bog 1 ). Derfor påvirker en ændring af det originale objekts forfattere begge instanser (bog1 og bog2), mens en ændring af det ydre element ( pris ) påvirker kun det originale objekt ( bog 1 ).

  ved hjælp af lavvandet kopi med brugerdefineret objekt

På den anden side skaber en dyb kopi en uafhængig kopi af det originale objekt, inklusive kopier af alle objekter indeholdt i det.

# Create a Book object 
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

I dette tilfælde vil den dybe kopi ( bog 2 ) er et fuldstændigt uafhængigt objekt, og ændrer det originale objekt ( bog 1 ) påvirker det ikke.

  ved hjælp af dyb kopi med brugerdefineret objekt

Anvendes til Shallow Copy og Deep Copy

Det er vigtigt at forstå dyb og overfladisk kopi, så du kan vælge den passende tilgang til at manipulere data. Her er nogle scenarier, hvor hver metode er anvendelig:

  • Brug en overfladisk kopi, hvis du vil replikere et komplekst objekt uden at generere nye forekomster af dets indlejrede objekter. Denne tilgang er mere hukommelseseffektiv og hurtigere end dyb kopiering, fordi den ikke dublerer indlejrede objekter.
  • Brug en overfladisk kopi til at skabe et snapshot af et objekts tilstand, mens du stadig deler nogle underliggende data mellem de originale og kopierede objekter.
  • Brug en dyb kopi, hvis du vil ændre en replika af et objekt uden at påvirke originalen. Dette genererer uafhængige kopier af indlejrede objekter, hvilket sikrer, at eventuelle ændringer af kopien ikke gælder for originalen.
  • Dyb kopiering er kritisk, når du har brug for uafhængige kopier af indlejrede datastrukturer, primært når du har at gøre med rekursive eller indviklede objekthierarkier.

Ydelse og overvejelser

Da overfladisk kopi ikke genererer nye forekomster af indlejrede objekter, kører den typisk hurtigere og bruger mindre hukommelse end dyb kopi. Originalen og den overfladiske kopi kan dog have uønskede bivirkninger ved at ændre delte interne elementer.

Især til store og dybt indlejrede datastrukturer, dyb kopi, en rekursiv procedure , kan være langsommere og bruge mere hukommelse. Det sikrer dog total uafhængighed mellem originalen og den dybe duplikat, hvilket gør indviklet datamanipulation mere sikker.

Den bedste kopimulighed for dine data

Mange programmeringssprog bruger konceptet overfladisk og dyb kopi. Forståelse af det giver dig mulighed for at manipulere data uden uforudsete konsekvenser.

Ved at bruge overfladiske og dybe kopieringsteknikker kan du vælge den bedste tilgang til at duplikere dine datastrukturer sikkert. Ved at forstå effekterne på dine data får du mere pålidelige og forudsigelige resultater fra din kode.