Поиск в 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
Но , хотя это совершенно идиоматический питон, кажется, что первая версия будет немного более очевидной для начинающих. Правильное использование генераторов, вызывая возвращаемую функцию, является распространенным заблуждением. Первая версия явно возвращает функцию.