Это происходит потому, что method_1
получает собственную локальную область видимости, в которой он может объявлять переменные.Python видит value = True
и думает, что вы создаете новую переменную с именем value
, локальную для method_1
.
. Причина, по которой Python делает это, заключается в том, чтобы избежать загрязнения локальных областей внешней области видимости переменными из внутренней функции,(Вы не хотели бы, чтобы назначения в обычных функциях уровня модуля приводили к созданию глобальных переменных!)
Если вы не присваиваете value
, то Python ищет внешние области в поисках переменной(поэтому чтение переменная работает, как и ожидалось, что продемонстрировано вашим method_2
).
Один из способов обойти это - использовать изменяемый объект вместо присвоения:
result = { 'value': False }
def method_1():
result['value'] = True
В Python 3 оператор nonlocal
(см. Также docs ) был добавлен именно для этого сценария:
def method_1():
nonlocal value
value = True # Works as expected -- assigns to `value` from outer scope