Maison > développement back-end > Tutoriel Python > Copie superficielle ou profonde dans les listes Python : quand dois-je utiliser « copy.deepcopy() » ?

Copie superficielle ou profonde dans les listes Python : quand dois-je utiliser « copy.deepcopy() » ?

Mary-Kate Olsen
Libérer: 2024-12-09 20:51:11
original
808 Les gens l'ont consulté

Shallow vs. Deep Copy in Python Lists: When Should I Use `copy.deepcopy()`?

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]]
Copier après la connexion

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]]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal