ProgrammatiePython ontwikkelaar

Beschrijf het verschil tussen shallow copy en deep copy in Python. Hoe kopieer je correct geneste datastructuren? Hoe werkt de copy-module?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In Python kan het kopiëren van objecten oppervlakkig (shallow copy) of diep (deep copy) zijn. Een oppervlakkige kopie creëert een nieuwe container, maar geneste objecten worden niet gekopieerd; in plaats daarvan worden er verwijzingen naar dezelfde objecten gebruikt. Een diepe kopie creëert recursief nieuwe kopieën van alle geneste objecten, waardoor onafhankelijkheid van de kopie wordt gegarandeerd.

De module copy biedt de methoden copy() (shallow copy) en deepcopy() (deep copy):

import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) deep = copy.deepcopy(original) shallow[0][0] = 99 print(original) # [[99, 2], [3, 4]] ← het oorspronkelijke object is gewijzigd! deep[1][1] = 42 print(original) # [[99, 2], [3, 4]] - is niet gewijzigd

Misleidende vraag.

Wat is het verschil tussen de operator list2 = list1 en het gebruik van copy.copy(list1)?

Antwoord: De operator list2 = list1 creëert een nieuwe verwijzing naar hetzelfde object. copy.copy(list1) maakt een oppervlakkige kopie aan, waardoor een nieuw lijstobject wordt gecreëerd, maar met dezelfde interne objecten. Voor geneste structuren is oppervlakkig kopiëren niet genoeg — er is een diepe kopie nodig.

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van dit onderwerp.


Verhaal

Tijdens de ontwikkeling van een REST API werden gegevens uit een sjabloon gekopieerd door gewone toewijzing (data = template). De volgende aanvraag wijzigde per ongeluk het "sjabloon" voor alle volgende gebruikers, omdat dezelfde verwijzing werd gebruikt.


Verhaal

In de rapportagemodule werden gegevens gekopieerd via copy.copy(), hoewel de structuur genest was (lijsten in woordenboeken). Wijzigingen in de kopie hadden onverwachts invloed op de oorspronkelijke gegevens, wat fouten in de statistieken veroorzaakte.


Verhaal

In een bankproject leidde een incorrecte kopie van een complex genest object via copy.copy() (in plaats van deepcopy()) tot verlies van transactieverleden — nieuwe bewerkingen overschreven oude, omdat de geneste elementen gedeeld waren.