Inzicht in ondiepe en diepe kopieën in Python

Inzicht in ondiepe en diepe kopieën in Python
Lezers zoals jij helpen MUO te ondersteunen. Wanneer u een aankoop doet via links op onze site, kunnen we een partnercommissie verdienen. Lees verder.

Python biedt verschillende efficiënte benaderingen voor het beheren van gegevens. Het begrijpen van ondiepe en diepe kopieerconcepten is van cruciaal belang bij het werken met gegevensstructuren zoals geneste lijsten, woordenboeken of aangepaste objecten.





MUO-video van de dag SCROLL OM DOOR TE GAAN MET INHOUD

Met zowel ondiepe als diepe kopieën kunt u replica's van gegevensstructuren maken, maar deze werken anders met betrekking tot geneste gegevens.





Met behulp van ondiepe kopie

Ondiepe kopie werkt door een kopie te maken van de structuur op het hoogste niveau van het originele object. Dit betekent dat, als het originele object geneste objecten bevat, de kopie naar dezelfde geneste objecten zal verwijzen als het origineel. Met andere woorden: bij het maken van een ondiepe kopie van een object wordt de buitenste structuur ervan gedupliceerd, en niet eventuele geneste objecten die het object bevat.





Om een ​​oppervlakkige kopie in Python uit te voeren, kun je de kopieermodule gebruiken kopiëren() functie of de .kopiëren() methode op het object.

Beschouw een voorbeeld van werken met een lijst of woordenboek in 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}")

In de bovenstaande code wordt de hoofd_lijst variabele bevat een lijst met gehele getallen en een binnenste lijst (genest object) met letters. De kopieerfunctie maakt een kopie van het hoofd_lijst die de code opslaat in een andere variabele, Oppervlakkige kopie .

hoe op te lossen is Google Play-services helaas gestopt

Alle wijzigingen die u aanbrengt in de Oppervlakkige kopie geneste lijst zal ook rechtstreeks van invloed zijn op die van de hoofd_lijst en vice versa. Deze wijzigingen laten zien dat de geneste of binnenste lijst van de Oppervlakkige kopie is slechts een verwijzing naar die van de hoofd_lijst , waardoor de wijzigingen van toepassing worden hoofd_lijst te.





  wijzigingen in de geneste lijst met ondiepe kopieën

Ondertussen zijn alle wijzigingen aangebracht aan de buitenste items (de gehele getallen) in beide Oppervlakkige kopie of hoofd_lijst heeft alleen invloed op dat exemplaar. Deze uiterlijke items zijn op zichzelf onafhankelijke waarden, en niet slechts louter referenties.

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

De uitvoer laat zien dat de buitenste items van beide lijsten onafhankelijk van elkaar zijn:





  wijzigingen in buitenste items van ondiepe kopie

Hetzelfde idee is van toepassing bij het werken met woordenboeken.

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

Wijzigingen aangebracht in het geneste woordenboek van dictaat1 beïnvloeden beide dictaat1 En dict2 . Tegelijkertijd zijn er wijzigingen in de buitenste items van dictaat1 heeft er alleen invloed op.

  gebruik van ondiepe kopie met genest woordenboek

Deepcopy gebruiken

In plaats van te verwijzen naar de geneste objecten van de originele kopie, maakt een diepe kopie een volledig afzonderlijke kopie van het originele object en de geneste objecten ervan. Het wijzigen van de diepe kopie heeft geen invloed op het originele object en omgekeerd; het zijn werkelijk afzonderlijke waarden.

Om een ​​diepe kopie in Python te maken, gebruik je de deepcopy() functie van de kopieermodule.

Beschouw een voorbeeld van het werken met een lijst.

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

Hier voert de code een diepe kopie uit van hoofd_lijst , waarbij een onafhankelijke kopie wordt gemaakt met de naam diepe_kopie .

Wanneer u de geneste lijst of buitenste items in de diepe_kopie , hebben uw wijzigingen geen invloed op de oorspronkelijke lijst, en omgekeerd. Dit toont aan dat de geneste lijst of buitenste elementen niet worden gedeeld tussen de twee kopieën.

  met behulp van deep copy met geneste lijst

Werken met aangepaste objecten

U kunt een aangepast object maken door het definiëren van een Python-klasse en het maken van een instantie van de klasse.

Hier is een voorbeeld van het maken van een eenvoudig object uit a Boek klas:

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}')"

Maak nu zowel een oppervlakkige als een diepe kopie van een exemplaar hiervan Boek klas met behulp van de kopiëren module.

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)

Zoals u kunt zien, is de ondiepe kopie ( boek2 ) is een nieuw object, maar verwijst naar hetzelfde interne object (auteurslijst) als het originele object ( boek 1 ). Een wijziging in de auteurs van het oorspronkelijke object heeft dus invloed op beide instanties (boek1 en boek2), terwijl een wijziging in het buitenste item ( prijs ) heeft alleen invloed op het originele object ( boek 1 ).

  gebruik van een ondiepe kopie met een aangepast object

Aan de andere kant creëert het maken van een diepe kopie een onafhankelijke kopie van het originele object, inclusief kopieën van alle objecten die zich daarin bevinden.

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

In dit geval is de diepe kopie ( boek2 ) is een volledig onafhankelijk object en wijzigt het originele object ( boek 1 ) heeft er geen invloed op.

  gebruik van deep copy met een aangepast object

Toepassingen voor oppervlakkig kopiëren en diep kopiëren

Het is essentieel om diepgaande en oppervlakkige kopieën te begrijpen, zodat u de juiste aanpak voor het manipuleren van gegevens kunt selecteren. Hier zijn enkele scenario's waarin elke methode van toepassing is:

  • Gebruik een ondiepe kopie als u een complex object wilt repliceren zonder nieuwe exemplaren van de geneste objecten te genereren. Deze aanpak is geheugenefficiënter en sneller dan deep copy, omdat geneste objecten niet worden gedupliceerd.
  • Gebruik een ondiepe kopie om een ​​momentopname te maken van de status van een object, terwijl u toch enkele onderliggende gegevens deelt tussen het originele en gekopieerde object.
  • Gebruik een diepe kopie als u een replica van een object wilt wijzigen zonder het origineel te beïnvloeden. Hierdoor worden onafhankelijke kopieën van geneste objecten gegenereerd, zodat eventuele wijzigingen in de kopie niet van toepassing zijn op het origineel.
  • Diepe kopieën zijn van cruciaal belang als u onafhankelijke kopieën van geneste gegevensstructuren nodig heeft, vooral als u te maken heeft met recursieve of ingewikkelde objecthiërarchieën.

Prestaties en overwegingen

Omdat oppervlakkig kopiëren geen nieuwe exemplaren van geneste objecten genereert, werkt het doorgaans sneller en gebruikt het minder geheugen dan diep kopiëren. Het origineel en de oppervlakkige kopie kunnen echter ongewenste bijwerkingen hebben als gevolg van het wijzigen van gedeelde interne items.

Met name voor grote en diep geneste datastructuren, deep copy, een recursieve procedure , kan langzamer zijn en meer geheugen gebruiken. Het garandeert echter een totale onafhankelijkheid tussen het origineel en het diepe duplicaat, waardoor ingewikkelde gegevensmanipulatie veiliger wordt.

hoeveel data gebruikt youtube?

De beste kopieeroptie voor uw gegevens

Veel programmeertalen gebruiken het concept van ondiepe en diepe kopie. Als u dit begrijpt, kunt u gegevens manipuleren zonder onvoorziene gevolgen.

Door gebruik te maken van ondiepe en diepe kopieertechnieken kunt u de beste aanpak kiezen om uw datastructuren veilig te dupliceren. Door de effecten op uw gegevens te begrijpen, krijgt u betrouwbaardere en voorspelbaardere resultaten uit uw code.