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)
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)
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
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!