В Python 3.x вы можете использовать оператор nonlocal
:
def fib_gen2():
a = b = 1
def next():
nonlocal a, b
a, b = b, a + b
return b - a
return next
В Python 2.x вам понадобится взломать:
def fib_gen2():
ab = [1, 1]
def next():
ab[:] = ab[1], ab[0] + ab[1]
return ab[1] - ab[0]
return next
Эта неудовлетворительная ситуация послужила причиной введения nonlocal
в Python 3.x.
Python не имеет объявлений переменных, поэтому он должен выяснить область действия каждой переменной. Это делается по простому правилу: если в функции есть присвоение имени, это имя является локальным для этой функции - за исключением того, что оно явно объявлено global
или nonlocal
. Во втором примере нет присвоения имени ab
- список изменен, но имя не переназначено. Таким образом, область действия - это ограждающая функция.