3.15 copy --- Opérations de copie superficielle et profonde

Ce module fournit des opérations de copie génériques (superficielle et profonde).

Résumé de l'interface:

import copy


x = copy.copy(y)        # produit une copie superficielle de y
x = copy.deepcopy(y)    # produit une copie profonde de y
Pour les erreurs propres à ce module, copy.error est déclenché.

La différence entre copie superficielle et profonde n'est pertinente que pour les objets composés (les objets qui contiennent d'autres objets, comme les listes et les instances de classe):

Souvent les opérations de copie profonde soulèvent deux problèmes qui n'existent pas avec les opérations de copie superficielle:

La fonction deepcopy() évite ces problèmes en:

Cette version ne copie pas des types comme module, classe, fonction, méthode, trace de pile, instance d'activation, fichier, socket, fenêtre, tableau, ou tout type similaire.

Les classes peuvent utiliser les mêmes interfaces pour contrôler la copie que pour contrôler la sérialisation: elles peuvent définir des méthodes appelées __getinitargs__(), __getstate__() et __setstate__(). Voir la description du module pickle pour des informations sur ces méthodes. Le module copy n'utilise pas le module de déclaration copy_reg.

Pour qu'une classe définisse sa propre implémentation de la copie, elle peut définir des méthodes __copy__() et __deepcopy__()spécifiques. La première est appelée pour implémenter l'opération de copie superficielle; on ne lui passe aucun argument supplémentaire. Le second est appelé pour implémenter l'opération de copie profonde; on lui passe un argument, le dictionnaire "mémo". Si l'implémentation de __deepcopy__()nécessite de réaliser une copie profonde d'un composant, elle doit appeler la fonction avec le composant comme premier argument et le dictionnaire "mémo" comme second argument.

Voir aussi:

Module pickle:
Discussion sur les méthodes spéciales utilisées pour la récupération et la restauration de l'état d'un objet.