← retour aux snippets

copy.deepcopy: personnaliser avec __deepcopy__

Contrôler la copie profonde d'un objet en implémentant __deepcopy__.

python copy #copy#deepcopy

objectif

Contrôler la copie profonde d’un objet en implémentant deepcopy.

code minimal

import copy
class C:
    def __init__(self, x): self.x = x
    def __deepcopy__(self, memo):
        return C(self.x)  # exemple simple
a = C([1]); b = copy.deepcopy(a)
print(a is not b and a.x == b.x)  # attendu: True

utilisation

import copy
class Node:
    def __init__(self, name, children=None): self.name=name; self.children=children or []
    def __deepcopy__(self, memo):
        cls = self.__class__
        dup = cls(self.name, [])
        memo[id(self)] = dup
        dup.children = [copy.deepcopy(ch, memo) for ch in self.children]
        return dup
root = Node("r", [Node("c")])
clone = copy.deepcopy(root)
print(clone is not root and clone.children[0].name == "c")

variante(s) utile(s)

import copy
print(callable(copy.deepcopy))

notes

  • Respectez le dict memo pour éviter la duplication de graphes cycliques.
  • Implémentez aussi copy pour la copie superficielle si besoin.