Полагаю, вы правы, рассматривая это как проблему "изменчивости". Хотя код, который вы опубликовали, выдает «UnboundLocalError», следующий код этого не делает:
def outer():
a = 0
def inner():
print a
inner()
outer()
Python не позволяет переназначить значение переменной из внешней области во внутреннюю область (если вы не используете ключевое слово «global», которое в данном случае неприменимо).
Ознакомьтесь с нижним разделом документации "классов" в этой документации Python 2.6.2:
[& hellip;] Если имя объявляется глобальным, тогда все ссылки и назначения отправляются
непосредственно к средней области, содержащей глобальные имена модуля.
В противном случае все переменные, найденные за пределами самой внутренней области видимости,
только для чтения (попытка записи в такую переменную просто создаст
новая локальная переменная в самой внутренней области, оставляя идентично
именованная внешняя переменная без изменений).
Ваш "UnboundLocalError" вызван тем, что ваша функция фактически объявляет новую переменную с именем "a", а затем сразу пытается выполнить операцию "+ =" над ней, но это не удается, потому что у "a" еще нет значения. (Просмотрите «a + = 1» как «a = a + 1», и вы увидите проблему, если «a» не определено).
В общем, если вы хотите изменить «а», люди обычно обходят его, используя изменяемый тип для передачи «а» (например, списка или словаря). Вы можете изменить «a» через содержимое изменяемого типа (как вы, вероятно, заметили при тестировании с этой настройкой).
Надеюсь, это поможет!