Maison >développement back-end >Tutoriel Python >Pourquoi la modification d'une liste Python pendant une itération entraîne-t-elle des résultats inattendus ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-12-27 18:36:11945parcourir

Why Does Modifying a Python List During Iteration Lead to Unexpected Results?

Modification itérative de liste en Python : comprendre les conséquences

En Python, modifier une liste tout en l'itérant peut conduire à des résultats inattendus. Considérez le code suivant :

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)

Au lieu de supprimer les nombres inférieurs à 20, comme prévu, ce code imprime une liste dans laquelle tous les nombres inférieurs à 20 sont manquants, ainsi que 20 lui-même.

Le problème : Iterator Position Shift

Le problème vient du fait que la suppression d'un élément d'une liste décale la position des éléments suivants. Au fur et à mesure que la boucle progresse, les éléments vérifiés ne sont plus ceux attendus, car les éléments supprimés créent des "trous" dans la liste.

Par exemple, lors de l'itération initiale, 1 est supprimé, mais l'itération suivante ne vérifie pas 2 ; au lieu de cela, il vérifie 3 car la liste a été raccourcie. Ce comportement persiste, entraînant une sortie incorrecte.

Techniques de modification de liste appropriées

Pour éviter ce problème, utilisez des méthodes alternatives pour modifier les listes pendant l'itération, telles que :

  • Liste Compréhension :
numbers = [n for n in numbers if n >= 20]
  • Modification sur place :
numbers[:] = (n for n in numbers if n >= 20)
  • Énumération :
for i, n in enumerate(numbers):
    if n < 20:
        numbers[i] = None
numbers = [n for n in numbers if n is not None]

Ces techniques ne modifient pas la longueur de la liste lors de l'itération, garantissant un traitement correct des éléments et le résultat souhaité.

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