Локальные функции в Python

Я использую nXML режим для редактирования и Опрятный , когда я хочу отформатировать и расположить с отступом XML или HTML. Существует также интерфейс Emacs для Уборки.

33
задан 9999years 23 June 2017 в 15:56
поделиться

2 ответа

Я считаю, что вы правы, рассматривая это как проблему "изменчивости". Хотя опубликованный вами код вызывает ошибку «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" с помощью содержимого изменяемого типа (как вы, вероятно, заметили при тестировании с этой настройкой).

Надеюсь, что это поможет!

30
ответ дан 27 November 2019 в 18:28
поделиться

Попробуйте привязать переменную в качестве аргумента.

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()
9
ответ дан 27 November 2019 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: