← Все вопросы

Как функция может помнить состояние между вызовами через nonlocal?

Задан 12 месяцев назад399 просмотров2 ответа
10

Хочу сделать счётчик, который увеличивается при каждом вызове, но без глобальной переменной и без класса. Слышал, что это делается через вложенную функцию и nonlocal. Как именно?

2 ответа

17
✓ Принятый ответ — помог автору

Внешняя функция держит переменную, внутренняя её меняет через nonlocal и возвращается наружу:

def make_counter():
    count = 0
    def step():
        nonlocal count
        count += 1
        return count
    return step

c = make_counter()
c()  # 1
c()  # 2
c()  # 3

nonlocal count говорит: «не создавай новую локальную переменную, а используй count из внешней функции». Без него count += 1 упадёт с UnboundLocalError, потому что присваивание сделало бы count локальной. Переменная count живёт в замыкании и не сбрасывается между вызовами c().

Роман Ильчик Каждый вызов make_counter() даёт независимый счётчик — удобно · 12 месяцев назад
5

Через замыкание + nonlocal. Без nonlocal будет UnboundLocalError на count += 1.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект