vorig hoofdstuk: Sets and Frozen Sets
volgend hoofdstuk: functies

Shallow and Deep Copy

Inleiding


zoals we hebben gezien in het hoofdstuk “Data Types and Variables”, vertoont Python een vreemd gedrag – in vergelijking met andere programmeertalen – bij het toewijzen en kopiëren eenvoudige gegevenstypen zoals gehele getallen en strings. Het verschil tussen ondiep en diep kopiëren is alleen relevant voor samengestelde objecten, dat zijn objecten die andere objecten bevatten, zoals lijsten of klasse instanties.,
in het volgende codefragment wijst y naar dezelfde geheugenlocatie als X. Dit verandert wanneer we een andere waarde toekennen aan y. in dit geval krijgt y een aparte geheugenlocatie, zoals we hebben gezien in het hoofdstuk “Data Types and Variables”.

>>> x = 3>>> y = x

maar zelfs als dit interne gedrag vreemd lijkt in vergelijking met programmeertalen zoals C, C++ en Perl, toch beantwoorden de waarneembare resultaten van de opdrachten aan onze verwachtingen. Maar het kan problematisch zijn, als we veranderlijke objecten zoals lijsten en woordenboeken kopiëren.Python maakt alleen echte kopieën als het moet, d.w.z., als de gebruiker, de programmeur, dit expliciet eist.
We zullen u de meest cruciale problemen laten zien, die kunnen optreden bij het kopiëren van veranderlijke objecten, dat wil zeggen bij het kopiëren van lijsten en woordenboeken.

een lijst kopiëren

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

in het bovenstaande voorbeeld wordt een eenvoudige lijst toegewezen aan kleuren1. In de volgende stap kennen we kleur1 toe aan kleuren2. Hierna wordt een nieuwe lijst toegewezen aan kleuren2.
zoals we hadden verwacht, bleven de waarden van kleuren1 onveranderd., Net als in ons voorbeeldin het hoofdstuk “Data types and variables” was er een nieuwe geheugenlocatie toegewezen voor kleuren2, omdat we een compleet nieuwe lijst hebben toegewezen aan deze variabele.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

maar de vraag is: wat gebeurt er als we een element van de lijst met kleuren2 of kleuren1 wijzigen?
in het voorbeeld hierboven kennen we een nieuwe waarde toe aan het tweede element van kleuren2. Veel beginners zullen verbaasd zijn dat de lijst met kleuren1 ook “automatisch” is gewijzigd.,
De verklaring is dat er geen nieuwe toewijzing is geweest aan kleuren2, alleen aan een van de elementen.

kopiëren met de Slice-Operator

Het is mogelijk om structuren van de ondiepe lijst volledig te kopiëren met de slice-operator zonder een van de hierboven beschreven bijwerkingen te hebben:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

maar zodra een lijst sublijsten bevat, hebben we dezelfde moeilijkheid, dat wil zeggen alleen verwijzingen naar de publists.,

>>> lst1 = ]>>> lst2 = lst1

dit gedrag wordt weergegeven in het volgende diagram:

Als u een nieuwe waarde toewijst aan het 0De Element van een van de twee lijsten, zal er geen bijwerking zijn. Problemen ontstaan, als je een van de elementen van de sublist te veranderen.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

het volgende diagram geeft aan wat er gebeurt als een van de elementen van een sublist wordt gewijzigd: zowel de inhoud van lst1 als lst2 worden gewijzigd.,

met behulp van de methode deepcopy van de Module copy

een oplossing voor de beschreven problemen is het gebruik van de module”copy”. Deze module biedt de methode “copy”, die een volledige kopie van een willekeurige lijst toestaat, dat wil zeggen ondiepe en andere lijsten.
Het volgende script gebruikt ons voorbeeld hierboven en deze methode:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

als we dit script opslaan onder de naam van deep_copy.py en als we het script noemen met “python deep_copy.,py”, zullen we de volgende uitvoer ontvangen:

$ python deep_copy.py ]]

vorig hoofdstuk: Sets en bevroren Sets
volgend hoofdstuk: functies

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *