Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Une question pour les experts

3 réponses
Avatar
alain
Salut tout le monde,

Quelqu'un peut-il m'expliquer le comportement suivant:

for i in range(10):
i=9
print "THIS SHOULD BE WRITTEN ONLY ONCE"

Malgre que je modifie explicitement le compteur de boucle, Python
affiche 10 fois le meme message.
Dans une comprehension de liste, par contre:
i=100
[ i for i in range(10)]
print i

Cette fois-ci, Python affiche cranement 9 au lieu de 100.
i semble etre une variable muette dans le premier cas et non muette
dans le second.
J'aurais prefere le comportement inverse

Merci de vos reponses

Alain

3 réponses

Avatar
Laurent Pointal
Salut tout le monde,

Quelqu'un peut-il m'expliquer le comportement suivant:

for i in range(10):
i=9
print "THIS SHOULD BE WRITTEN ONLY ONCE"

Malgre que je modifie explicitement le compteur de boucle, Python
affiche 10 fois le meme message.


Parce que Python fait parcourir la liste range(10) à i, quelque soit le
traitement que tu fasses sur i.
Ce n'est pas une boucle C avec un test de continuation, dans le
byte-code c'est une vraie instruction d'itération sur une séquence.
Regarde du côté de:

import dis
def f() :
for i in range(10) :



i = 9
print "Ici"


dis.dis(f)
...surprise...




Bref, si tu veux sortir de la boucle: break

Dans une comprehension de liste, par contre:
i0
[ i for i in range(10)]
print i

Cette fois-ci, Python affiche cranement 9 au lieu de 100.


C'est un effet de bord assez critiqué, mais qui existe.

i semble etre une variable muette dans le premier cas et non muette
dans le second.


Dans le premier cas elle n'est pas muette (fait un print i après la
boucle pour vérifier), par contre les modifications effectuées à
l'intérieur de la boucle n'ont pas d'effet sur les itérations.

J'aurais prefere le comportement inverse


Faudra faire avec...

A+

Laurent.



Avatar
alain
Ce qui est curieux c'est ceci:

for i in range(10):
print "i=",i
i0
print "JE SUIS ICI"
else:
print "i",i

La seconde ligne affiche la valeur du compteur tandis que la derniere
ligne affiche 100.
C'est deconcertant.
Merci de la reponse

Alain
Avatar
Laurent Pointal
Ce qui est curieux c'est ceci:

for i in range(10):
print "i=",i
i0
print "JE SUIS ICI"
else:
print "i",i

La seconde ligne affiche la valeur du compteur tandis que la derniere
ligne affiche 100.
C'est deconcertant.


C'est normal, à la dernière itération tu ne réaffectes pas de nouvelle
valeur à i. Et après cette itération, comme c'est une sortie normale de
la boucle, tu passes dans le bloc else.

Merci de la reponse

Alain