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 imprimirá (9,2).
Esto me parece extraño: 'foo' en realidad solo controla el bucle, y 'bar' se definió dentro del bucle. Puedo entender por qué podría ser necesario acceder a 'bar' 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 dentro del alcance después de que salga el bucle. En mi experiencia, simplemente abarrota el espacio de nombres global y hace que sea más difícil rastrear errores que los intérpretes podrían detectar en otros idiomas.
for
bucle atempere su espacio de nombres global, envuélvalo en una función. Cierres en abundancia!Respuestas:
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 han estado contentos de no tener que desambiguar el 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
global
palabra clave 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
En resumen, probablemente puedas echarle la culpa a la comunidad de Python: P
fuente
Python no tiene bloques, al igual que otros lenguajes (como C / C ++ o Java). Por lo tanto, la unidad de alcance en Python es una función.
fuente
for
bucles de alcance son una extensión natural de un principio general. En Python tendría que ser un caso especial, y los casos especiales deben evitarse a menos que tengan beneficios convincentes.Un caso realmente útil para esto es cuando se usa
enumerate
y desea el recuento total al final:¿Es esto necesario? No. Pero seguro que es conveniente.
Otra cosa a tener en cuenta: en Python 2, las variables en las comprensiones de listas también se filtran:
Pero, lo mismo no se aplica a Python 3.
fuente
else
cláusula, es decir.else: print "I did something {0} times".format(count)
- antes de que desaparezca el alcance local (que no existe en Python)someiterator
está vacío?else
podría usar una cláusula en este caso, no funcionaría en general ya que el cuerpo del bucle podríabreak
prematuramente.Si tiene una declaración de interrupción en el ciclo (y desea usar el valor de iteración más tarde, tal vez para recuperar, indexar algo o dar estado), le ahorra una línea de código y una asignación, por lo que es conveniente.
fuente
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.
fuente
Para empezar, si las variables fueran locales para los bucles, esos bucles serían inútiles para la mayoría de la programación del mundo real.
En la situación actual:
rendimientos
45
. Ahora, considere cómo funciona la asignación en Python. Si las variables de bucle fueran estrictamente locales:cede
0
, porquetotal
dentro del ciclo después de la asignación no es la misma variable quetotal
fuera del ciclo. Esto no sería un comportamiento óptimo o esperado.fuente
total
yfoo
todavía tendría enlaces de bucle local en el escenario del OP y la lógica es la misma.