10

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

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

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

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

4

2 回答 2

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外部范围。

于 2011-07-03T23:47:06.413 回答
5

与语言 X 闭包相比,Python 中的闭包有哪些限制?

Python 2.x 中的 nonlocal 关键字

例子:

def closureMaker():
     x = 0
     def closure():
         nonlocal x
         x += 1
         print(x)
     return closure
于 2011-07-04T00:03:01.787 回答