Une question pour les experts

Le
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:
i0
[ 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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Pointal
Le #605461
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.



alain
Le #605460
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
Laurent Pointal
Le #605459
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



Publicité
Poster une réponse
Anonyme