Esto ocurre porque method_1
tiene su propio alcance local donde puede declarar variables. Python ve value = True
y cree que está creando una nueva variable llamada value
, local en method_1
.
La razón por la que Python hace esto es para evitar contaminar las entidades locales del osciloscopio externo con variables de una función interna. (¡No desearía que las asignaciones en funciones regulares a nivel de módulo den como resultado la creación de variables globales!)
Si no asigna value
, Python busca los ámbitos externos buscando la variable (entonces leyendo la variable funciona como se esperaba, como lo demuestra su method_2
).
Una forma de evitar esto es mediante el uso de un objeto mutable en lugar de assigment:
result = { 'value': False }
def method_1():
result['value'] = True
En Python 3, el nonlocal
statement (ver también docs) se añadió precisamente para este escenario:
def method_1():
nonlocal value
value = True # Works as expected -- assigns to `value` from outer scope
Este hilo es un ejemplo perfecto de por qué los cinco minutos de edición gratuita a veces son malos. – agf
@agf: ¿Por qué es malo? – Cameron