带有副作用的Python闭包

时间:2011-07-03 23:41:39

标签: python closures side-effects

我想知道Python中的闭包是否可以操作其命名空间中的变量。你可能会称这种副作用,因为状态在闭包本身之外被改变了。我想做这样的事情

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

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

显然我希望做的更复杂,但这个例子说明了我在说什么。

2 个答案:

答案 0 :(得分:17)

你不能在Python 2.x中做到这一点,但是你可以使用技巧来获得相同的效果:使用可变对象,例如列表。

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

您还可以使x成为具有命名属性或字典的对象。这比列表更易读,特别是如果要修改多个这样的变量。

在Python 3.x中,您只需要将nonlocal x添加到内部函数中。这会导致x的分配转到外部范围。

答案 1 :(得分:4)

What limitations have closures in Python compared to language X closures?

nonlocal keyword in Python 2.x

示例:

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