Es ist notwendig, dass es so funktioniert, wenn Sie darüber nachdenken. Der Ausdruck für die Sequenz einer for
Schleife kann alles sein:
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
Wir können die Sequenz nicht bei jedem Durchlauf durch die Schleife abfragen, oder hier würden wir beim zweiten Mal aus dem nächsten Stapel von 5 Bytes lesen . Natürlich muss Python das Ergebnis des Ausdrucks in irgendeiner Weise privat speichern, bevor die Schleife beginnt.
Sind sie in verschiedenen Bereichen?
Nein. Um dies zu bestätigen, können Sie einen Verweis auf das ursprüngliche Bereichswörterbuch ( local () ) behalten und feststellen, dass Sie tatsächlich dieselben Variablen in der Schleife verwenden:
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc
print loc["x"]
break
Was ist unter der Haube los, damit so etwas funktioniert?
Sean Vieira hat genau gezeigt, was unter der Haube vor sich geht, aber um es in besser lesbarem Python-Code zu beschreiben, entspricht Ihre for
Schleife im Wesentlichen dieser while
Schleife:
it = iter(x)
while True:
try:
x = it.next()
except StopIteration:
break
print x
Dies unterscheidet sich von dem herkömmlichen Indizierungsansatz für die Iteration, den Sie in älteren Java-Versionen sehen würden, zum Beispiel:
for (int index = 0; index < x.length; index++) {
x = x[index];
...
}
Dieser Ansatz schlägt fehl, wenn die Elementvariable und die Sequenzvariable identisch sind, da die Sequenz x
nicht mehr verfügbar ist, um den nächsten Index nachzuschlagen, nachdem das erste Mal x
dem ersten Element zugewiesen wurde.
Beim ersteren Ansatz it = iter(x)
fordert die erste Zeile ( ) jedoch ein Iteratorobjekt an, das tatsächlich für die Bereitstellung des nächsten Elements von da an verantwortlich ist. Auf die Sequenz, auf die x
ursprünglich verwiesen wurde, muss nicht mehr direkt zugegriffen werden.
for i in printAndReturn [1,2,3,4,5] …
, wie oft soll[1,2,3,4,5]
gedruckt werden?