Измените переменные функции из внутренней функции в python

#python #function #variables #scope

#python #функция #переменные #область видимости

Вопрос:

Можно получить и распечатать внешнюю переменную функции a

 def outer():
    a = 1
    def inner():
        print a
 

Также можно получить массив внешних функций a и добавить что-нибудь

 def outer():
    a = []
    def inner():
        a.append(1)
        print a
 

Однако это вызвало некоторые проблемы, когда я попытался увеличить целое число:

 def outer():
    a = 1
    def inner():
        a  = 1 #or a = a   1
        print a

>> UnboundLocalError: local variable 'a' referenced before assignment
 

Почему это происходит и как я могу достичь своей цели (увеличить целое число)?

Комментарии:

1. Конечно, вы также можете передать a во внутреннюю из outer .

2. @sberry: это не позволит сделать то, что он пытается сделать, поскольку это создаст новую локальную переменную внутри inner , изменения в которой не будут отражены outer .

3. Правильно, если только оно не возвращено, или OP в любом случае использует только a внутри inner .

Ответ №1:

В Python 3 вы можете сделать это с nonlocal помощью ключевого слова. Сделайте nonlocal a в начале inner пометку a как нелокальную.

В Python 2 это невозможно.

Ответ №2:

Обходной путь для Python 2:

 def outer():
    a = [1]
    def inner():
        a[0]  = 1
        print a[0]
 

Ответ №3:

Обычно более чистый способ сделать это был бы:

 def outer():
    a = 1
    def inner(b):
        b  = 1
        return b
    a = inner(a)
 

Python позволяет многое, но нелокальные переменные обычно можно считать «грязными» (не вдаваясь в подробности здесь).