Ошибка при спользовании nonlocal

question1 = False


@bot.message_handler(commands=['begin'])
def f_question1(message):
    bot.reply_to(message, "Ok! Let's start!")
    bot.reply_to(message, "What is the position of the person to whom the statement is addressed?")
    nonlocal question1
    question1 = True

Ошибка в строке "nonlocal question1". Текст ошибки: SyntaxError: no binding for nonlocal 'question1' found Может я не правильно понимаю принцип работы nonlocal или просто невнимательный. Но я же создя перменую question1 во внешнем scope относительно функции.


Ответы (1 шт):

Автор решения: Pavel Durmanov

nonlocal нужен для случаев с замыканиями. Например:

In [20]: def foo():
    ...:     var = 5
    ...:     def bar():
    ...:         nonlocal var
    ...:         var = 6
    ...:     bar()
    ...:     return var
    ...:

In [21]: foo()
Out[21]: 6

Как видите, мы изменили значения переменной ну уровень выше функции bar. Функция бар "замкнула" в тебе переменную. Если хотите более детально разобраться в замыканиях, изучите тему декораторов.

global нужен для изменения глобальных переменных (определены на уровне модуля), например:

In [23]: def foo():
    ...:     global var
    ...:     var = 11
    ...:     return var
    ...:

In [24]: foo()
Out[24]: 11

Как видите, изменилась переменная на. уровне модуля.

Вот наглядный пример одновременного использования nonlocal & global:

In [28]: var = 10

In [29]: def foo():
    ...:     var = 11
    ...:     def bar():
    ...:         nonlocal var
    ...:         var = 100
    ...:     bar()
    ...:     return var
    ...:

In [30]: foo()
Out[30]: 100

In [31]: var
Out[31]: 10

Как видите, глобальная var не изменила свое значения, в то время как внутренняя var изменилась. nonlocal никак не влияет на глобальные переменные.

Вот небольшая визуализация:

введите сюда описание изображения

Использовать global не рекомендуется.

→ Ссылка