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

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

Patricia Arquette
Libérer: 2025-01-05 15:52:40
original
431 Les gens l'ont consulté

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

Modification d'une liste pendant une itération

L'extrait de code fourni présente un comportement inattendu lors de la modification d'une liste en la parcourant :

l  = range(100)                         
for i in l:                         
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
Copier après la connexion

Le résultat de ce code diffère de ce à quoi on pourrait s'attendre car le fait de modifier la liste (en faisant apparaître des éléments) affecte le itérateur. Lorsqu'un itérateur est créé pour une liste, il garde une trace de la position actuelle dans la liste. Au fur et à mesure que des éléments sont supprimés de la liste, la position de l'itérateur est ajustée en conséquence. Cependant, si la liste est modifiée alors que l'itération est en cours, la position de l'itérateur devient invalide et des résultats imprévisibles peuvent survenir.

Dans ce cas précis, la boucle a pour but de boucler sur les éléments de la liste l . Cependant, lorsqu'un élément est retiré de la liste, la position de l'itérateur est décalée, ce qui l'oblige à sauter l'élément suivant de la liste. En conséquence, la boucle parcourt seulement la moitié des éléments de la liste d'origine.

Pour éviter ce comportement, il est important de ne jamais modifier le conteneur sur lequel l'itération est effectuée. Au lieu de cela, il faut créer une copie du conteneur et parcourir cela. Ceci peut être réalisé en copiant la liste avant de démarrer la boucle :

l_copy = l[:]
for i in l_copy:
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
Copier après la connexion

Alternativement, on peut utiliser une boucle while au lieu d'une boucle for, qui maintient un index séparé pour la position actuelle dans la liste :

i = 0
while i < len(l):
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
    i += 1
Copier après la connexion

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