Es necesario que funcione de esta manera, si lo piensa. La expresión de la secuencia de un for
bucle podría ser cualquier cosa:
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
No podemos consultar la secuencia en cada paso a través del ciclo, o aquí terminaríamos leyendo del siguiente lote de 5 bytes la segunda vez. Naturalmente, Python debe almacenar de alguna manera el resultado de la expresión de forma privada antes de que comience el ciclo.
¿Están en diferentes ámbitos?
No. Para confirmar esto, puede mantener una referencia al diccionario de alcance original ( locals () ) y notar que, de hecho, está usando las mismas variables dentro del ciclo:
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc
print loc["x"]
break
¿Qué está pasando debajo del capó que permite que algo como esto funcione?
Sean Vieira mostró exactamente lo que está sucediendo bajo el capó, pero para describirlo en un código Python más legible, su for
ciclo es esencialmente equivalente a este while
ciclo:
it = iter(x)
while True:
try:
x = it.next()
except StopIteration:
break
print x
Esto es diferente del enfoque tradicional de indexación para la iteración que vería en versiones anteriores de Java, por ejemplo:
for (int index = 0; index < x.length; index++) {
x = x[index];
...
}
Este enfoque fallaría cuando la variable de elemento y la variable de secuencia son iguales, porque la secuencia x
ya no estaría disponible para buscar el índice siguiente después de que la primera vez x
se reasigne al primer elemento.
Sin embargo, con el primer enfoque, la primera línea ( it = iter(x)
) solicita un objeto iterador que es realmente responsable de proporcionar el siguiente elemento a partir de ese momento. x
Ya no es necesario acceder directamente a la secuencia a la que apuntaba originalmente.
for i in printAndReturn [1,2,3,4,5] …
, ¿cuántas veces se deben[1,2,3,4,5]
imprimir?