Comment copier en profondeur une liste : comprendre les copies superficielles et profondes
Supposons que vous ayez une liste E0 et que vous créiez une copie E0_copy à l'aide de la liste (E0). Intuitivement, vous pourriez supposer que E0_copy est une copie complète puisque leurs identifiants diffèrent. Cependant, la modification de E0_copy dans une boucle modifie également E0 de manière inattendue. Pourquoi cela se produit-il ?
Le piège des copies superficielles
list(...) crée une copie superficielle, ce qui signifie qu'elle ne duplique que la liste la plus externe tout en conservant les références aux mêmes listes internes. Par conséquent, lorsque vous manipulez une liste interne de E0_copy, vous impactez également E0 car les deux listes pointent vers les mêmes structures internes.
La solution : la copie approfondie
Pour effectuer une copie complète, utilisez la fonction copy.deepcopy(...). Il crée une véritable copie profonde en copiant de manière récursive tous les objets, y compris les structures imbriquées. Cette opération garantit que les modifications apportées à la copie n'affectent pas l'original.
Démonstration
Considérez l'extrait de code suivant, où list(...) donne un copie superficielle :
a = [[1, 2, 3], [4, 5, 6]] b = list(a) print(a == b) # True, indicates shallow copy
Maintenant, en utilisant copy.deepcopy(...) pour une copie profonde copie :
import copy b = copy.deepcopy(a) print(a == b) # False, confirms deep copy
Maintenant, la modification de a n'affecte pas b, démontrant l'isolement fourni par la copie profonde.
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!