Кроме глобальных переменных бывают nonlocal-переменные. Они очень похожи на глобальные. При ссылке переменную, которая не определена в текущей функции, будет использована "ближайшая" из локальных переменных в объемлющих функциях, либо в глобальной области видимости. Если же переменную пометить как nonlocal, то поиск переменной не будет производиться за пределами инструкций def ни в глобальной области видимости объемлющего модуля, ни во встроенной области видимости, даже если переменные с такими именами там существуют. Переменные, помеченные как nonlocal, можно менять внутри функции, при этом будет изменяться её значение в соответствующей объемлющей функции. В отличие от global декларация nonlocal не позволяет создать переменную во внешней области видимости.

def tester():
    state = 1
    print(state)
    def nested():
        state = 2
        print(state)
    nested()
 
    print(state)
tester()
>>> 1
>>> 2
>>> 1
def tester():
    state = 1
    print(state)
    def nested():
        nonlocal state
        state = 2
        print(state)
    nested()
 
    print(state)
tester()
>>> 1
>>> 2
>>> 2
Последнее изменение: Суббота, 15 Август 2020, 02:35