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 ?

Pourquoi la suppression d'éléments d'une liste Python pendant une itération entraîne-t-elle des résultats inattendus ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 12:34:10161parcourir

Why Does Removing Elements from a Python List During Iteration Lead to Unexpected Results?

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!

Déclaration:
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