Ошибка при спользовании 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 шт):
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 не рекомендуется.
