带有副作用的Python闭包

10 投票
2 回答
732 浏览
提问于 2025-04-16 20:46

我在想,Python中的闭包是否可以操作它自己命名空间里的变量。你可以把这称为副作用,因为状态在闭包外部被改变。我想做的事情类似于这个

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

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

显然,我希望做的事情比这更复杂,但这个例子说明了我想表达的意思。

2 个回答

5

Python中的闭包与其他语言的闭包相比有什么限制?

Python 2.x中的nonlocal关键字

示例:

def closureMaker():
     x = 0
     def closure():
         nonlocal x
         x += 1
         print(x)
     return closure
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的赋值就会作用到外部的范围。

撰写回答