有人可以解释一下以下输出吗?(涉及IT技术)

3
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

如果变量'b'保存了函数'adder'的作用域中的变量(x=3),那么无论您调用它多少次,输出都应该是'4'。

2
如果不是修改那个被记住的变量,你认为 x+=1 是在做什么? - jasonharper
@jasonharper 我觉得你没有理解我的问题。请看我在问题中的最后一行。如果'b'被分配了函数'adder',并且记住了'x'的值为'3',那么为什么连续的调用会改变这个值。无论我在哪里调用它,如何调用它,x不应该被实例化为'3'吗?难道不是'b'持有函数,并始终将x设置为3。 - pragun
1
你上一次实例化 x 是在 b = closure_add() 这行代码中。随后对 b() 的调用只会修改 x 的那个实例。(还有另一个 x 实例与变量 a 相关联)。 - jasonharper
2个回答

2
以下链接应提供更多信息: 最终在您的示例中,这归结为以下几点:
  1. 您在变量 ab 中实例化了两个独立的函数对象。
  2. 您调用 a 一次,它会将值增加一次。
  3. 您调用 b 三次,它会将值增加三次。
由于在增加值的方法中,被定义为 nonlocal 的闭包存储在父函数中每次对其进行更改时在 x 变量中。

1

x += 1 修改了 nonlocal 变量 x。因此,下一次调用 closure_add() 时,x 的值已经增加。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接