Maison > développement back-end > Tutoriel Python > Pourquoi la modification d'une liste pendant une itération en Python entraîne-t-elle un comportement inattendu ?

Pourquoi la modification d'une liste pendant une itération en Python entraîne-t-elle un comportement inattendu ?

DDD
Libérer: 2024-12-12 22:17:13
original
149 Les gens l'ont consulté

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

Impact de la modification des listes pendant l'itération

Lorsque vous travaillez avec des listes en Python, il est crucial d'être prudent lorsque vous les modifiez pendant l'itération. Tenter de manipuler la liste d'origine tout en la parcourant peut conduire à des résultats imprévisibles.

Considérez l'exemple de code suivant :

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

Vous pourriez vous attendre à ce que ce code imprime chaque élément de la liste, puis supprimez les deux premiers éléments, en répétant ce processus pour les éléments restants. Cependant, le résultat réel s'écartera de cette attente.

La raison de cette anomalie réside dans la modification de la liste lors de l'itération. Supprimer des éléments de la liste à l'aide de l.pop(0) modifie sa taille et son ordre. En conséquence, l'itérateur i devient obsolète, ce qui entraîne un comportement erratique de la boucle.

Éviter la modification de la liste pendant l'itération

Pour éviter de tels problèmes, il est conseillé de créer un copie de la liste et parcourir la copie. Cela garantit que la liste d'origine reste inchangée et que l'itérateur fournit un accès précis aux éléments tout au long de la boucle.

Par exemple, le code suivant illustre cette approche :

l_copy = list(l)  # Create a copy of l
for i in l_copy:
    print(i)
    print(l.pop(0))
    print(l.pop(0))
Copier après la connexion

Maintenant, la sortie s'aligne sur le comportement attendu, car la liste d'origine l conserve son intégrité, tandis que la copie modifiée l_copy est utilisée pour l'itération.

Alternativement, comme suggéré dans le réponse fournie, vous pouvez utiliser une boucle while avec un index pour contrôler l'itération et apporter les modifications nécessaires à la liste d'origine dans la boucle.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal