Supposons que j'ai une boucle for:
for i in range(1,10):
if i is 5:
i = 7
Je veux changer i
s'il remplit certaines conditions. J'ai essayé mais ça n'a pas marché. Comment dois-je procéder?
Pour votre exemple particulier, cela fonctionnera:
for i in range(1, 10):
if i in (5, 6):
continue
Cependant, vous seriez probablement mieux avec une boucle while
:
i = 1
while i < 10:
if i == 5:
i = 7
# other code
i += 1
Une boucle for
assigne une variable (dans ce cas i
) à l'élément suivant dans la liste/itérable au début de chaque itération. Cela signifie que peu importe ce que vous faites dans la boucle, i
deviendra l'élément suivant. La boucle while
n'a pas une telle restriction.
Un peu plus d'informations sur les raisons pour lesquelles la boucle de la question ne fonctionne pas comme prévu.
Une boucle
for i in iterable:
# some code with i
est fondamentalement un raccourci pour
iterator = iter(iterable)
while True:
try:
i = next(iterator)
except StopIteration:
break
# some code with i
Ainsi, la boucle for
extrait les valeurs d'un itérateur construit à partir de l'itérable un par un et reconnaît automatiquement quand cet itérateur est épuisé et s'arrête.
Comme vous pouvez le voir, à chaque itération de la boucle while
i est réaffecté, la valeur de i
sera donc remplacée quelles que soient les autres réaffectations que vous émettez dans le # some code with i
partie.
Pour cette raison, les boucles for
dans Python ne sont pas adaptées aux modifications permanentes de la variable de boucle et vous devez plutôt recourir à une boucle while
, comme cela a déjà été fait été démontré dans la réponse de Volatility.
Ce concept n'est pas inhabituel dans le monde C, mais doit être évité si possible. Néanmoins, c'est ainsi que je l'ai mis en œuvre, d'une manière qui me semblait claire sur ce qui se passait. Ensuite, vous pouvez mettre votre logique pour sauter en avant dans l'index n'importe où dans la boucle, et un lecteur saura prêter attention à la variable skip, tandis que l'incorporation d'un i = 7 quelque part en profondeur peut facilement être manquée:
skip = 0
for i in range(1,10):
if skip:
skip -= 1
continue
if i=5:
skip = 2
<other stuff>