Подтвердить что ты не робот

Почему вложенные функции могут обращаться к переменным из внешних функций, но им не разрешено изменять их

Во втором случае ниже Python пытается найти локальную переменную. Когда он не находит его, почему он не может выглядеть во внешнем пространстве, как это делается для первого случая?

Это ищет x в локальной области, затем внешнюю область:

def f1():
    x = 5
    def f2():
         print x

Это дает ошибку local variable 'x' referenced before assignment:

def f1():
    x = 5
    def f2():
        x+=1

Мне не разрешено изменять подпись функции f2(), поэтому я не могу передавать и возвращать значения x. Однако мне нужен способ изменения x. Есть ли способ явно указать Python искать имя переменной во внешней области (что-то похожее на ключевое слово global)?

Версия Python: 2.7

4b9b3361

Ответ 1

def f1():
    x = { 'value': 5 }
    def f2():
        x['value'] += 1

Обходным путем является использование изменяемого объекта и обновление членов этого объекта. Иногда привязка имени сложна в Python.

Ответ 2

В Python 3.x это возможно:

def f1():
        x = 5
        def f2():
                nonlocal x
                x+=1
        return f2

Проблема и ее решение для Python 2.x также приведены в этом сообщении. Кроме того, пожалуйста, прочитайте PEP 3104 для получения дополнительной информации по этому вопросу.