Вот что-то вдохновленное предложением Алоиса Махдала, сделанным в комментарии относительно другого ответа :
class Nonlocal(object):
""" Helper to implement nonlocal names in Python 2.x """
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def outer():
nl = Nonlocal(y=0)
def inner():
nl.y += 1
return nl.y
return inner
f = outer()
print(f(), f(), f()) # -> (1 2 3)
Обновление
Оглядываясь на это недавно, я был поражен тем, насколько он похож на декоратор, - когда меня осенило, что реализация его как единого сделает его более универсальным и полезным (хотя это, возможно, ухудшает его читабельность для некоторыхстепень).
# Implemented as a decorator.
class Nonlocal(object):
""" Decorator class to help implement nonlocal names in Python 2.x """
def __init__(self, **kwargs):
self._vars = kwargs
def __call__(self, func):
for k, v in self._vars.items():
setattr(func, k, v)
return func
@Nonlocal(y=0)
def outer():
def inner():
outer.y += 1
return outer.y
return inner
f = outer()
print(f(), f(), f()) # -> (1 2 3)
Обратите внимание, что обе версии работают в Python 2 и 3.