while for español else ejemplos contador bucle python variables if-statement scope local-variables

for - if en python



¿Cuál es el alcance de una variable inicializada en una sentencia if? (7)

Soy nuevo en Python, así que esta es probablemente una pregunta de alcance simple. El siguiente código en un archivo de Python (módulo) me confunde ligeramente:

if __name__ == ''__main__'': x = 1 print x

En otros idiomas en los que he trabajado, este código lanzaría una excepción, ya que la variable x es local a la sentencia if y no debería existir fuera de ella. Pero este código se ejecuta e imprime 1. ¿Alguien puede explicar este comportamiento? ¿Todas las variables creadas en un módulo son globales / están disponibles para todo el módulo?


A diferencia de lenguajes como C, una variable de Python está dentro del alcance de toda la función (o clase o módulo) donde aparece, no solo en el "bloque" más interno. Es como si declararas int x en la parte superior de la función (o clase o módulo), excepto que en Python no tienes que declarar variables.

Tenga en cuenta que la existencia de la variable x se verifica solo en el tiempo de ejecución, es decir, cuando llega a la declaración de print x . Si __name__ no fuera igual a "__main__" , obtendría una excepción: NameError: name ''x'' is not defined .


Como dijo Eli, Python no requiere declaración de variable. En C dirías:

int x; if(something) x = 1; else x = 2;

pero en Python la declaración es implícita, por lo que cuando asigna a x se declara automáticamente. Esto se debe a que Python se escribe dinámicamente; no funcionaría en un lenguaje de tipo estático, ya que, dependiendo de la ruta utilizada, una variable podría usarse sin ser declarada. Esto se detectaría en tiempo de compilación en un lenguaje de tipo estático, pero se permite con un lenguaje de tipo dinámico.

La única razón por la que un lenguaje estático está limitado a tener que declarar variables fuera de las sentencias if debido a este problema. ¡Abraza la dinámica!


El alcance en python sigue este orden:

  • Busca el ámbito local

  • Buscar el alcance de cualquier función de cierre.

  • Busca el ámbito global

  • Buscar en los incorporados

( source )

Tenga en cuenta que if y otras construcciones de bucle / ramificación no están en la lista, solo las clases, funciones y módulos proporcionan alcance en Python, por lo que cualquier cosa declarada en un bloque if tiene el mismo alcance que cualquier elemento que se haya descartado fuera del bloque. Las variables no se verifican en el momento de la compilación, por lo que otros idiomas lanzan una excepción. En Python, siempre que la variable exista en el momento en que la requieras, no se lanzará ninguna excepción.


Las variables de Python están orientadas a la función, clase o módulo más interno en el que están asignadas. Los bloques de control como if y while bloques no cuentan, por lo que una variable asignada dentro de un if todavía está dentro del alcance de una función, clase o módulo.

(Las funciones implícitas definidas por una expresión generadora o la comprensión de lista / conjunto / dict cuentan, al igual que las expresiones lambda. No puede rellenar una declaración de asignación en ninguna de ellas, pero los parámetros lambda y los objetivos de la cláusula son asignaciones implícitas).


Sí, están en el mismo "ámbito local", y en realidad el código como este es común en Python:

if condition: x = ''something'' else: x = ''something else'' use(x)

Tenga en cuenta que x no se ha declarado o inicializado antes de la condición, como si estuviera en C o Java, por ejemplo.

En otras palabras, Python no tiene ámbitos de nivel de bloque. Tenga cuidado, sin embargo, con ejemplos tales como

if False: x = 3 print(x)

lo que claramente plantearía una excepción NameError .


Sí. También es cierto for alcance. Pero no funciona por supuesto.

En su ejemplo: si la condición en la sentencia if es falsa, no se definirá x .


está ejecutando este código desde la línea de comandos, por if tanto, if condiciones son verdaderas y x está establecida. Comparar:

>>> if False: y = 42 >>> y Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> y NameError: name ''y'' is not defined