def closure_add():
x = 3
def adder():
nonlocal x
x+=1
return x
return adder
a = closure_add()
b = closure_add()
print(a())
print(b())
print(b())
print(b())
输出结果为:
4
4
5
6
如果保持函数'adder'的变量'b'记住变量的范围(x = 3),无论你调用它多少次,输出都不应该是'4'。
答案 0 :(得分:2)
以下链接应提供更多信息:
这最终归结为你的例子:
a
和b
a
一次,它会增加一次值b
三次,这会使值增加三次由于闭包中增加的值是在将其增加为nonlocal
的方法中定义的,因此在父函数中对x
进行的每次更改之后都会存储该值。变量。
答案 1 :(得分:1)
行x += 1
正在修改nonlocal
变量x
。因此,下次调用closure_add()
时,x
的值会增加。
但是,请注意,每个adder()
函数对象(closure_add()
返回的函数)“拥有”x
的单独副本。这解释了为什么第一次调用a()
和b()
输出4
。