有人可以解释下面的输出吗?

时间:2018-02-17 17:35:47

标签: python function scope closures

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'。

2 个答案:

答案 0 :(得分:2)

以下链接应提供更多信息:

这最终归结为你的例子:

  1. 您在变量ab
  2. 中实例化两个单独的函数对象
  3. 您调用a一次,它会增加一次值
  4. 您调用b三次,这会使值增加三次
  5. 由于闭包中增加的值是在将其增加为nonlocal的方法中定义的,因此在父函数中对x进行的每次更改之后都会存储该值。变量。

答案 1 :(得分:1)

x += 1正在修改nonlocal变量x。因此,下次调用closure_add()时,x的值会增加。

但是,请注意,每个adder()函数对象(closure_add()返回的函数)“拥有”x的单独副本。这解释了为什么第一次调用a()b()输出4