broncode: Lib/copy.py

toewijzing statements in Python kopiëren geen objecten, ze maken banden tussen een doel en een object. Voor collecties die veranderbaar zijn of die bruikbare items bevatten, is soms een kopie nodig, zodat men de ene kopie kan veranderen zonder de andere te veranderen. Deze module biedt generieke ondiepe en diepe copyoperaties (hieronder uitgelegd).

Interface summary:

copy.copy(x)¶

Geef een ondiepe kopie van x Terug.,

copy.deepcopy(x)¶

retourneer een diepe kopie van x.

uitzondering copy.error

verhoogd voor module specifieke fouten.

het verschil tussen ondiep en diep kopiëren is alleen relevant voor compoundobjects (objecten die andere objecten bevatten, zoals lijsten of class instances):

  • een ondiep kopiëren maakt een nieuw samengesteld object en voegt er dan (voor zover mogelijk) verwijzingen in toe naar de objecten in het origineel.,

  • een diepe kopie maakt een nieuw samengesteld object en plaatst er recursief kopieën van de objecten in het origineel in.

twee problemen bestaan vaak met diepe kopieerbewerkingen die niet bestaan met ondiepe kopieerbewerkingen:

  • recursieve objecten (samengestelde objecten die direct of indirect een referentie naar zichzelf bevatten) kunnen een recursieve lus veroorzaken.

  • omdat deep copy alles kopieert, kan het te veel kopiëren, zoals gegevens die bedoeld zijn om tussen kopieën te worden gedeeld.,

de functie deepcopy() vermijdt deze problemen door:

  • een memo woordenboek van objecten die al zijn gekopieerd tijdens de currentcopying pass; en

  • door de gebruiker gedefinieerde klassen de kopieerbewerking of de reeks gekopieerde componenten te laten overschrijven.

Deze module kopieert geen types zoals module, method, stack trace,stack frame, file, socket, window, array of soortgelijke types., Het” kopieert ” functies en klassen (ondiep en diep), door het oorspronkelijke object ongewijzigd terug te geven; dit is compatibel met de manier waarop deze worden behandeld door de pickle module.

klassen kunnen dezelfde interfaces gebruiken om kopiëren te beheren als ze gebruiken om pickling te beheren. Zie de beschrijving van module pickle voor informatie over deze methoden. In feite gebruikt de copy module de registeredpickle functies van de copyreg module.,

om een klasse zijn eigen kopieerimplementatie te laten definiëren, kan het speciale methoden definiëren __copy__() en __deepcopy__(). De eerste wordt genoemd om de ondiepe kopie operatie te implementeren; er worden geen extra argumenten doorgegeven.Dit laatste wordt aangeroepen om de deep copy operatie te implementeren; het wordt één jaar geleden doorgegeven, het memo woordenboek., Als de__deepcopy__() implementatie een diepe kopie van een component moet maken, moet het dedeepcopy() functie aanroepen met het component als eerste argument en het memo dictionary als tweede argument.

zie ook

Module pickle

bespreking van de speciale methoden die worden gebruikt om het ophalen en herstellen van objectstatus te ondersteunen.