我想知道 Python 中的闭包是否可以操作其命名空间中的变量。您可能会称此为副作用,因为状态正在闭包本身之外更改。我想做这样的事情
def closureMaker():
x = 0
def closure():
x+=1
print x
return closure
a = closureMaker()
a()
1
a()
2
显然我希望做的更复杂,但这个例子说明了我在说什么。
最佳答案
在 Python 2.x 中你不能完全做到这一点,但你可以使用一个技巧来获得相同的效果:使用可变对象,例如列表。
def closureMaker():
x = [0]
def closure():
x[0] += 1
print x[0]
return closure
您还可以使 x 成为具有命名属性或字典的对象。这比列表更具可读性,尤其是当您要修改多个此类变量时。
在 Python 3.x 中,您只需将 nonlocal x
添加到您的内部函数中。这会导致对 x
的赋值转到外部范围。
关于带有副作用的 Python 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566227/