Закрытие Python с побочными эффектами - PullRequest
9 голосов
/ 04 июля 2011

Мне интересно, возможно ли для замыкания в Python манипулировать переменными в его пространстве имен. Вы можете назвать это побочными эффектами, потому что состояние изменяется вне самого замыкания. Я хотел бы сделать что-то вроде этого

def closureMaker():
  x = 0
  def closure():
    x+=1
    print x
  return closure

a = closureMaker()
a()
1
a()
2

Очевидно, что то, что я надеюсь сделать, является более сложным, но этот пример иллюстрирует то, о чем я говорю.

Ответы [ 2 ]

17 голосов
/ 04 июля 2011

Вы не можете сделать это точно в Python 2.x, но вы можете использовать хитрость, чтобы получить тот же эффект: использовать изменяемый объект, такой как список.

def closureMaker():
    x = [0]
    def closure():
        x[0] += 1
        print x[0]
    return closure

Вы также можете сделать x объектом с именованным атрибутом или словарем. Это может быть более читабельным, чем список, особенно если у вас есть несколько таких переменных для изменения.

В Python 3.x вам просто нужно добавить nonlocal x к вашей внутренней функции. Это приводит к тому, что присвоения x переходят во внешнюю область.

4 голосов
/ 04 июля 2011
...