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
Wat is het verschil tussen de operator
list2 = list1en 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.
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 vandeepcopy()) tot verlies van transactieverleden — nieuwe bewerkingen overschreven oude, omdat de geneste elementen gedeeld waren.