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

Pourquoi la modification d'une liste pendant l'itération provoque-t-elle des résultats inattendus en Python ?

DDD
DDDoriginal
2024-12-24 16:14:18865parcourir

Why Does Modifying a List During Iteration Cause Unexpected Results in Python?

Comprendre les dangers liés à la modification de listes pendant l'itération

Parcourir une liste tout en y apportant des modifications peut entraîner un comportement inattendu en raison d'incohérences entre l'état de la liste et la compréhension qu'en a l'itérateur. Pour illustrer cela, considérons le code Python suivant :

l = range(100)
for i in l:
    print(i)
    print(l.pop(0))
    print(l.pop(0))

Au lieu de la sortie attendue de nombres séquentiels, ce code produit un résultat particulier. La raison réside dans le fait que pendant que l'itérateur parcourt la liste l, la liste elle-même est modifiée. Plus précisément, la méthode pop(0) supprime les éléments du début de l.

Pour éviter de telles incohérences, il est crucial d'éviter de modifier le conteneur sur lequel l'itération est effectuée. Une solution courante consiste à créer une copie du conteneur et à parcourir la copie. Cependant, dans des cas comme celui-ci, où l'objectif est de modifier le conteneur d'origine, une approche différente est nécessaire.

Considérez le code alternatif suivant :

i = 0
while i < len(some_list):
    print(some_list[i])
    print(some_list.pop(0))
    print(some_list.pop(0))
    i += 1

Dans ce code, nous utilisons une boucle while pour contrôler l'itération manuellement. Au lieu de parcourir directement la liste, nous utilisons un index i pour accéder aux éléments, puis extrayons manuellement les éléments de some_list. Cela garantit que la boucle répond aux mises à jour de some_list.

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