← Все вопросы
Как функция может помнить состояние между вызовами через nonlocal?
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.
Ваш ответ
Войдите, чтобы ответить на вопрос.