Python: las variables aún son accesibles si están definidas en try o if?

Soy un principiante de Python y soy de fondo C / C ++. Estoy usando Python 2.7.

Leí este artículo: una guía para principiantes de los espacios de nombres de Python, la resolución del scope y la regla LEGB , y creo que tengo cierta comprensión de estas tecnologías en Python.

Hoy me di cuenta de que puedo escribir código Python así:

if condition_1: var_x = some_value else: var_x = another_value print var_x 

Es decir, var_x sigue siendo accesible, incluso si no está definido antes de if. Debido a que soy de fondo C / C ++, esto es algo nuevo para mí, ya que en C / C ++, var_x se define en el ámbito que se var_x en if y else, por lo tanto, no puede acceder a él a menos que defina var_x antes de if .

He intentado buscar las respuestas en Google, pero como todavía soy nuevo en Python, ni siquiera sé por dónde empezar y qué palabras clave debo usar.

Mi conjetura es que, en Python, if no crea un nuevo ámbito. Todas las variables que se acaban de definir en if están solo en el ámbito en el que reside if y es por eso que la variable sigue siendo accesible después de if . Sin embargo, si var_x , en el ejemplo anterior, solo se define en if pero no en else , se emitirá una advertencia para indicar que la print var_x puede hacer referencia a una variable que puede no estar definida.

Tengo cierta confianza en mi propia comprensión. Sin embargo, ¿ podría alguien ayudarme a corregirme si me equivoco en algún lugar o darme un enlace del documento que discute sobre esto?

Gracias.

Mi conjetura es que, en Python, if no crea un nuevo ámbito. Todas las variables que se acaban de definir en if están solo en el ámbito en el que reside if y es por eso que la variable sigue siendo accesible después de if .

Eso es correcto. En Python, los espacios de nombres , que esencialmente deciden sobre los ámbitos variables, solo se crean para módulos y funciones (incluidos los métodos, básicamente cualquier def ). Entonces, todo lo que sucede dentro de una función (y no en una subfunción) se coloca en el mismo espacio de nombres.

Sin embargo, es importante saber que la mera existencia de una asignación dentro de una función reservará un nombre en el espacio de nombres local. Esto hace para algunas situaciones interesantes:

 def outer (): x = 5 def inner (): print(x) # x = 10 inner() outer() 

En el código anterior, con esa línea comentada, el código se imprimirá 5 como puede esperar. Esto se debe a que inner buscará en el ámbito externo el nombre x . Sin embargo, si agrega la línea x = 10 , el nombre x será local a inner , por lo que la búsqueda anterior a x buscará en el espacio de nombres local de inner . Pero como aún no se ha asignado, recibirá un UnboundLocalError ( “variable local ‘x’ referenciada antes de la asignación” ). La statement nonlocal se agregó en Python 3 para superar un problema: la situación en la que desea modificar realmente la x del ámbito externo dentro de la función interna.

Para obtener más información sobre la búsqueda de nombres, consulte esta pregunta relacionada .