Copie approfondie de listes : au-delà des approches superficielles
Lorsque vous essayez de copier une liste à l'aide de list(...), on pourrait supposer qu'elle crée une copie complète basée sur l'observation que id(E0) diffère de id(E0_copy). Cependant, cette hypothèse est erronée.
Shallow Copying Trap
list(...) n'effectue pas de copie approfondie, ce qui implique une copie récursive des objets internes. Au lieu de cela, il copie uniquement la liste la plus externe, en conservant les références aux listes internes d'origine. Ainsi, les modifications apportées aux listes internes affectent à la fois la liste originale et la liste copiée.
Copie approfondie avec copy.deepcopy
Pour créer une véritable copie approfondie, utilisez la copie. copie profonde (...). Cette méthode copie de manière récursive tous les niveaux d'objets, garantissant que les modifications apportées à la copie n'ont pas d'impact sur l'original.
Exemple
Considérez l'extrait de code suivant :
>>> a = [[1, 2, 3], [4, 5, 6]] >>> b = list(a) >>> a [[1, 2, 3], [4, 5, 6]] >>> b [[1, 2, 3], [4, 5, 6]] >>> a[0][1] = 10 >>> a [[1, 10, 3], [4, 5, 6]] >>> b # b changes too -> Not a deepcopy. [[1, 10, 3], [4, 5, 6]]
Dans cet exemple, list(...) crée une copie superficielle de a. Lorsque a[0][1] est modifié, b change également, indiquant qu'ils font référence aux mêmes listes internes.
Comparez cela avec ce qui suit :
>>> import copy >>> b = copy.deepcopy(a) >>> a [[1, 10, 3], [4, 5, 6]] >>> b [[1, 10, 3], [4, 5, 6]] >>> a[0][1] = 9 >>> a [[1, 9, 3], [4, 5, 6]] >>> b # b doesn't change -> Deep Copy [[1, 10, 3], [4, 5, 6]]
En utilisant copy.deepcopy, nous créons une véritable copie profonde d'un. Les modifications apportées à a n'affectent pas b, confirmant qu'il s'agit d'objets distincts avec leurs propres copies de listes internes.
Conclusion
Lorsque la copie approfondie des listes est essentielle, n'oubliez pas de utilisez copy.deepcopy(...) pour vous assurer que les modifications apportées à la copie n'affectent pas l'original. Cette compréhension est cruciale pour maintenir l'intégrité des données et éviter des conséquences inattendues dans votre code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!