Поиск в Google «нелокальный python» обнаружил предложение PEP 3104 , в котором полностью описывается синтаксис и обоснование этого утверждения. короче говоря, он работает точно так же, как и global
оператор, за исключением того, что он используется для ссылки на переменные, которые не являются ни глобальными, ни локальными для функции.
Вот краткий пример того, что вы можете сделать с этим. Счетчик генератора может быть переписан, чтобы использовать его так, чтобы он больше походил на идиомы языков с замыканиями.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
Очевидно, вы можете написать это как генератор, например:
def counter_generator():
count = 0
while True:
count += 1
yield count
Но хотя это совершенно идиоматический питон, похоже, что первая версия будет немного более очевидной для начинающих. Правильное использование генераторов, вызывая возвращаемую функцию, является распространенным заблуждением. Первая версия явно возвращает функцию.