källkod: Lib/copy.py

tilldelningsdeklarationer i Python kopierar inte objekt, de skapar bindningsmellan ett mål och ett objekt. För samlingar som är muterbara eller innehållerbara objekt behövs ibland en kopia så att man kan ändra en kopia utan att ändra den andra. Denna modul ger generiska grunda och djupa kopieringsoperationer (förklaras nedan).

interface summary:

copy.copy(x)¶

returnera en grund kopia av x.,

copy.deepcopy(x)¶

returnera en djup kopia av x.

undantagcopy.error

höjt för modulspecifika fel.

skillnaden mellan grund och djup kopiering är endast relevant för compoundobjects (objekt som innehåller andra objekt, som listor eller klassinstanser):

  • en grund kopia konstruerar ett nytt sammansatt objekt och sedan (i förlängningen) infogar referenser till de objekt som finns i originalet.,

  • en djup kopia konstruerar ett nytt sammansatt objekt och sedan, rekursivt, insertscopies in i det av objekten som finns i originalet.

två problem finns ofta med djupa kopieringsoperationer som inte existerar med grundkopieringsoperationer:

  • rekursiva objekt (sammansatta objekt som direkt eller indirekt innehåller areference till sig själva) kan orsaka en rekursiv slinga.

  • eftersom deep copy kopierar allt det kan kopiera för mycket, till exempel datasom är avsett att delas mellan kopior.,

funktionendeepcopy() undviker dessa problem genom att:

  • hålla enmemo ordbok över objekt som redan kopierats under det aktuella passet.och

  • låta användardefinierade klasser åsidosätta kopieringen eller uppsättningen av komponenter kopierade.

den här modulen kopierar inte typer som modul, metod, stack trace, stack frame,file, socket, window, array eller liknande typer., Det gör” kopiera ” funktioner ochklasser (grunt och djupt), genom att returnera det ursprungliga objektet oförändrat; dettaär kompatibelt med hur dessa behandlas av pickle – modulen.

klasser kan använda samma gränssnitt för att styra kopiering som de använder för att controlpickling. Se beskrivningen av modulen pickle för information om dessa metoder. Faktum är att copy – modulen använder registeredpickle-funktionerna från copyreg – modulen.,

för att en klass ska kunna definiera sin egen kopieringsimplementering kan den definieraspeciella metoder __copy__()och __deepcopy__(). Den förstnämnda kallas för att genomföra den grunda kopieringsoperationen; inga ytterligare argument skickas.Den senare kallas för att implementera deep copy-operationen; den skickas oneargument, memo – ordboken., Om__deepcopy__() – implementeringen behöver göra en djup kopia av en komponent, bör den anropa funktionen deepcopy() med komponenten som första argument och memo-ordlistan som andra argument.

Se även

modulpickle

diskussion om de speciella metoder som används för att stödja objekttillstånd hämtning ochåterställning.