若在闭包中使用变量,则在扩充赋值中重新定义该变量



以下是示例:

def foo1():
res = 0
def foo2():
nonlocal res
res += 10
return 20
rv = foo2()
res += rv
print(res)
foo1()  # output: 30 

res在闭合时增加10,变为10,然后加上foo2返回的10,从而得到20。到目前为止,一切都很好。

这是另一个类似的案例:

def foo1():
res = 0
def foo2():
nonlocal res
res += 10
return 20
res += foo2()
print(res)
foo1()  # output: 20

奇怪的是,它输出10。

res似乎是在res += foo2()中重新定义的。我觉得对吗?

为什么上面例子的结果是10?结果是什么?

  • CPython 3.6.9

基于症状,在堆栈伪代码中,它的行为类似

推res,推foo2((,添加,弹出res

因此,在foo2中间对res的更改对结果没有影响。因为它";"抓";res的值先于foo2,并在表达式中使用该值。

或者你可以显示这样的伪代码:

temp1 = res
temp2 = foo2()
temp1 = temp1 + temp2
res = temp1

最新更新