带有副作用的Python闭包
我在想,Python中的闭包是否可以操作它自己命名空间里的变量。你可以把这称为副作用,因为状态在闭包外部被改变。我想做的事情类似于这个
def closureMaker():
x = 0
def closure():
x+=1
print x
return closure
a = closureMaker()
a()
1
a()
2
显然,我希望做的事情比这更复杂,但这个例子说明了我想表达的意思。
2 个回答
5
示例:
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
的赋值就会作用到外部的范围。