Il est nécessaire que cela fonctionne de cette façon, si vous y réfléchissez. L'expression pour la séquence d'un for
La boucle peut être n'importe quoi :
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
Nous ne pouvons pas interroger la séquence à chaque passage de la boucle, sinon nous nous retrouverions à lire le fichier suivant lot de 5 octets la deuxième fois. Naturellement, Python doit d'une manière ou d'une autre stocker le résultat de l'expression en privé avant que la boucle ne commence.
Sont-ils dans des portées différentes ?
Non. Pour le confirmer, vous pouvez conserver une référence au dictionnaire scope original ( locals() ) et remarquez que vous utilisez en fait les mêmes variables à l'intérieur de la boucle :
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc # True
print loc["x"] # 1
break
Qu'est-ce qui se passe sous le capot qui permet à quelque chose comme ça de de fonctionner ?
Sean Vieira a montré exactement ce qui se passe sous le capot, mais pour le décrire dans un code python plus lisible, il faut que votre for
est essentiellement équivalent à ceci while
boucle :
it = iter(x)
while True:
try:
x = it.next()
except StopIteration:
break
print x
Cette approche est différente de l'approche traditionnelle de l'indexation de l'itération que l'on peut voir dans les anciennes versions de Java, par exemple :
for (int index = 0; index < x.length; index++) {
x = x[index];
...
}
Cette approche échouerait lorsque la variable de l'élément et la variable de la séquence sont les mêmes, car la séquence x
ne serait plus disponible pour rechercher l'indice suivant après la première fois. x
a été réaffecté au premier poste.
Avec la première approche, cependant, la première ligne ( it = iter(x)
) demande un objet itérateur qui est en fait responsable de fournir l'élément suivant à partir de ce moment-là. La séquence qui x
vers lequel il était pointé à l'origine n'a plus besoin d'être accédé directement.