Codice sorgente: Lib/copy.py

Le istruzioni di assegnazione in Python non copiano gli oggetti, creano binding tra un target e un oggetto. Per le raccolte che sono elementi mutabili o containmutable, a volte è necessaria una copia in modo da poter modificare una copia senza cambiare l’altra. Questo modulo fornisce copyoperations generiche superficiali e profonde (spiegate di seguito).

Riepilogo dell’interfaccia:

copy.copy(x)¶

Restituisce una copia superficiale di x.,

copy.deepcopy(x)¶

Restituisce una copia profonda di x.

eccezionecopy.error

Generato per errori specifici del modulo.

La differenza tra la copia superficiale e profonda è rilevante solo per compoundobjects (oggetti che contengono altri oggetti, come elenchi o istanze di classe):

  • Una copia superficiale costruisce un nuovo oggetto composto e quindi (in misura possibilepossibile) inserisce riferimenti agli oggetti trovati nell’originale.,

  • Una copia profonda costruisce un nuovo oggetto composto e quindi, ricorsivamente, inseriscecopie in esso degli oggetti trovati nell’originale.

Esistono spesso due problemi con operazioni di copia profonda che non esistono con operazioni di copia superficiale:

  • Oggetti ricorsivi (oggetti composti che, direttamente o indirettamente, contengono areference a se stessi) possono causare un ciclo ricorsivo.

  • Perché deep copy copia tutto ciò che potrebbe copiare troppo, ad esempio datache è destinato a essere condiviso tra le copie.,

deepcopy() funzione evita questi problemi da parte di:

  • mantenere un memo dizionario di oggetti già copiati durante il currentcopying pass; e

  • lasciare che le classi definite dall’utente ignorare l’operazione di copia, o l’insieme ofcomponents copiato.

Questo modulo non copia tipi come module, method, stack trace, stack frame,file, socket, window, array o altri tipi simili., Fa” copia ” funzioni e classi (poco profonde e profonde), restituendo l’oggetto originale invariato; questo è compatibile con il modo in cui questi sono trattati dal modulo pickle.

Le classi possono utilizzare le stesse interfacce per controllare la copia che usano per controlpickling. Vedere la descrizione del modulo pickle per informazioni su questi metodi. Infatti, il modulocopy utilizza le funzioni registeredpickle dal modulocopyreg.,

Affinché una classe definisca la propria implementazione di copia, può definiremetodi speciali __copy__()e __deepcopy__(). Il primo è chiamatoper implementare l’operazione di copia superficiale; non vengono passati argomenti aggiuntivi.Quest’ultimo è chiamato per implementare l’operazione deep copy; viene passato oneargument, il dizionario memo., Se l’implementazione__deepcopy__() necessita di fare una copia profonda di un componente, dovrebbe chiamare la funzionedeepcopy() con il componente come primo argomento e il dizionario memo come secondo argomento.

Vedere anche

Modulo pickle

Discussione dei metodi speciali utilizzati per supportare il recupero e il ripristino dello stato dell’oggetto.