以下是示例:
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