Вы не можете сделать это точно в Python 2.x, но вы можете использовать хитрость, чтобы получить тот же эффект: использовать изменяемый объект, такой как список.
def closureMaker():
x = [0]
def closure():
x[0] += 1
print x[0]
return closure
Вы также можете сделать x объектом с именованным атрибутом или словарем. Это может быть более читабельным, чем список, особенно если у вас есть несколько таких переменных для изменения.
В Python 3.x вам просто нужно добавить nonlocal x
к вашей внутренней функции. Это приводит к тому, что присвоения x
переходят во внешнюю область.