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