Maison >développement back-end >Tutoriel Python >Pourquoi la suppression d'éléments d'une liste Python pendant une itération entraîne-t-elle des résultats inattendus ?
Comprendre la suppression de liste pendant l'itération en Python
Lors d'une itération sur une liste, il peut être nécessaire de supprimer des éléments. Cependant, cela peut entraîner des comportements inattendus si la suppression n'est pas gérée correctement.
Considérez le code Python :
a = list(range(10)) remove = False for b in a: if remove: a.remove(b) remove = not remove print(a)
Ce code produit la sortie [0, 2, 3, 5 , 6, 8, 9], au lieu du [0, 2, 4, 6, 8] attendu. Cette anomalie survient en raison de la façon dont Python gère les objets mutables lors de l'itération.
Explication visuelle du problème
La séquence d'opérations peut être visualisée comme suit :
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | b = 0; remove? no ^ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | b = 1; remove? yes ^ [0, 2, 3, 4, 5, 6, 7, 8, 9] | b = 3; remove? no ^ [0, 2, 3, 4, 5, 6, 7, 8, 9] | b = 4; remove? yes ^ [0, 2, 3, 5, 6, 7, 8, 9] | b = 6; remove? no ^ [0, 2, 3, 5, 6, 7, 8, 9] | b = 7; remove? yes ^ [0, 2, 3, 5, 6, 8, 9] | b = 9; remove? no ^
Aucune indication d'erreur
Python le fait ne génère pas d'erreur lorsque l'itérateur sous-jacent est modifié, car déterminer quand et comment une mutation affecterait l'itérateur nécessiterait une analyse d'exécution approfondie, ralentissant considérablement l'exécution.
Cohérence du comportement
Le comportement décrit dans cet exemple est resté cohérent dans toutes les versions de Python, garantissant une exécution prévisible du code qui modifie les objets mutables au cours de l'itération.
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!