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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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
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
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
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
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.
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.