two - El alcance en Python 'for' loops




python two nested for loops (4)

La respuesta más probable es que simplemente mantiene la gramática simple, no ha sido un obstáculo para la adopción, y muchos se han contentado con no tener que eliminar la ambigüedad del alcance al que pertenece un nombre al asignarlo dentro de una construcción de bucle. Las variables no se declaran dentro de un alcance, está implícito en la ubicación de las declaraciones de asignación. La palabra clave global existe solo por este motivo (para indicar que la asignación se realiza en un ámbito global).

Actualizar

Aquí hay una buena discusión sobre el tema: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

Las propuestas anteriores para hacer que las variables for-loop locales del bucle hayan tropezado con el problema del código existente que se basa en la variable de bucle manteniendo su valor después de salir del bucle, y parece que esto se considera una característica deseable.

En resumen, probablemente puedas culpar a la comunidad de Python: P

No estoy preguntando sobre las reglas de alcance de Python; En general, entiendo cómo funciona el alcance en Python para bucles. Mi pregunta es por qué las decisiones de diseño se tomaron de esta manera. Por ejemplo (sin juego de palabras):

for foo in xrange(10):
    bar = 2
print(foo, bar)

Lo anterior se imprimirá (9,2).

Esto me parece extraño: 'foo' realmente solo controla el loop, y 'bar' se definió dentro del loop. Puedo entender por qué podría ser necesario que 'bar' fuera accesible fuera del bucle (de lo contrario, los bucles tendrían una funcionalidad muy limitada). Lo que no entiendo es por qué es necesario que la variable de control permanezca en el alcance después de que termine el ciclo. En mi experiencia, simplemente satura el espacio de nombres global y hace que sea más difícil rastrear los errores que podrían atrapar los intérpretes en otros idiomas.


Para empezar, si las variables fueran bucles locales, esos bucles serían inútiles para la mayoría de la programación del mundo real.

En la situación actual:

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total

rinde 45 . Ahora, considere cómo funciona la asignación en Python. Si las variables de bucle fueron estrictamente locales:

# Sum the values 0..9?
total = 0
for foo in xrange(10):
    # Create a new integer object with value "total + foo" and bind it to a new
    # loop-local variable named "total".
    total = total + foo
print total

produce 0 , porque el total dentro del ciclo después de la asignación no es la misma variable que el total fuera del ciclo. Este no sería el comportamiento óptimo o esperado.


Un caso realmente útil para esto es cuando se utiliza enumerate y desea el recuento total al final:

for count, x in enumerate(someiterator):
    dosomething(count, x)
print "I did something {0} times".format(count)

¿Es esto necesario? No. Pero, seguro, es conveniente.

Otra cosa a tener en cuenta: en Python 2, las variables en las listas de comprensión también se filtran:

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9

Pero, lo mismo no se aplica a Python 3.


Una de las principales influencias para Python es ABC , un lenguaje desarrollado en los Países Bajos para enseñar conceptos de programación a principiantes. El creador de Python, Guido van Rossum, trabajó en ABC durante varios años en la década de 1980. No sé casi nada sobre ABC, pero como está destinado a principiantes, supongo que debe tener un número limitado de ámbitos, al igual que los primeros BASIC.





scope