copy
— Ytliga och djupa kopieringsoperationer¶
Källkod: Lib/copy.py
Tilldelningssatser i Python kopierar inte objekt, de skapar bindningar mellan ett mål och ett objekt. För samlingar som är föränderliga eller innehåller föränderliga objekt behövs ibland en kopia så att man kan ändra den ena kopian utan att ändra den andra. Denna modul tillhandahåller generiska ytliga och djupa kopieringsoperationer (förklaras nedan).
Sammanfattning av gränssnittet:
- copy.copy(obj)¶
Returnerar en ytlig kopia av obj.
- copy.deepcopy(obj[, memo])¶
Returnerar en djup kopia av obj.
- copy.replace(obj, /, **changes)¶
Skapar ett nytt objekt av samma typ som obj, där fälten ersätts med värden från changes.
Tillagd i version 3.13.
- exception copy.Error¶
Utlöses för modulspecifika fel.
Skillnaden mellan ytlig och djup kopiering är endast relevant för sammansatta objekt (objekt som innehåller andra objekt, t.ex. listor eller klassinstanser):
En ytlig kopia konstruerar ett nytt sammansatt objekt och infogar sedan (i den mån det är möjligt) referenser till de objekt som finns i originalet.
En djup kopia konstruerar ett nytt sammansatt objekt och infogar sedan rekursivt kopior i det av de objekt som finns i originalet.
Det finns ofta två problem med djupa kopieringsoperationer som inte finns med ytliga kopieringsoperationer:
Rekursiva objekt (sammansatta objekt som, direkt eller indirekt, innehåller en referens till sig själva) kan orsaka en rekursiv loop.
Eftersom djup kopia kopierar allt kan den kopiera för mycket, t.ex. data som är avsedd att delas mellan kopior.
Funktionen deepcopy()
undviker dessa problem genom att:
hålla en ”memo”-ordbok över objekt som redan kopierats under det aktuella kopieringstillfället; och
genom att låta användardefinierade klasser åsidosätta kopieringsoperationen eller uppsättningen av kopierade komponenter.
Den här modulen kopierar inte typer som modul, metod, stack trace, stack frame, fil, socket, fönster eller några liknande typer. Den ”kopierar” funktioner och klasser (ytligt och djupt) genom att returnera det ursprungliga objektet oförändrat; detta är kompatibelt med hur dessa behandlas av pickle
-modulen.
Ytliga kopior av ordböcker kan göras med dict.copy()
, och av listor genom att tilldela en bit av hela listan, till exempel copied_list = original_list[:]
.
Klasser kan använda samma gränssnitt för att styra kopiering som de använder för att styra betning. Se beskrivningen av modulen pickle
för information om dessa metoder. Faktum är att modulen copy
använder de registrerade pickle-funktionerna från modulen copyreg
.
För att en klass ska kunna definiera sin egen kopieringsimplementering kan den definiera specialmetoderna __copy__()
och __deepcopy__()
.
- object.__copy__(self)¶
Anropas för att implementera den ytliga kopieringsoperationen; inga ytterligare argument skickas.
- object.__deepcopy__(self, memo)¶
Anropas för att implementera djupkopieringsoperationen; den får ett argument, memo-ordboken. Om implementationen
__deepcopy__
behöver göra en djup kopia av en komponent, bör den anropa funktionendeepcopy`()
med komponenten som första argument och memo-ordboken som andra argument. Ordboken memo bör behandlas som ett opakt objekt.
Funktionen copy.replace()
är mer begränsad än copy()
och deepcopy()
, och stöder endast namngivna tupler skapade av namedtuple()
, dataclasses
, och andra klasser som definierar metoden __replace__()
.
- object.__replace__(self, /, **changes)¶
Denna metod bör skapa ett nytt objekt av samma typ, där fälten ersätts med värden från changes.
Tillagd i version 3.13.
Se även
- Modul
pickle
Diskussion om de speciella metoder som används för att stödja hämtning och återställning av objektstatus.