提问人:stackUnderflow 提问时间:12/12/2022 更新时间:12/12/2022 访问量:37
Python:递归中非局部变量的意外行为
Python: Unexpected behaviour of nonlocal variable in recursion
问:
以下代码应在调用 3 次后将非局部变量设置为 true。我希望在以下代码中返回后始终为 true(从 0 开始)flag
recur()
flag
recur(2)
def f():
flag = False
def recur(n):
nonlocal flag
print(f"this is recur {n}")
print("flag is: ", flag)
if n == 2:
print(f"end of recur {n}")
print("flag is: ", flag)
return True
flag = flag or recur(n+1) # the culprit line
print(f"end of recur {n}")
print("flag is: ", flag)
return False
recur(0)
f()
但是,当 recur(1) 返回时,会从 true 跳到 false。该函数的输出如下:flag
this is recur 0
flag is: False
this is recur 1
flag is: False
this is recur 2
flag is: False
end of recur 2
flag is: False
end of recur 1
flag is: True
end of recur 0
flag is: False <-- I expect this to be true
当我将罪魁祸首行更改为 时,代码按预期工作,即 在 recur(2) 返回后将始终为 true。flag = recur(n+1) or flag
flag
我怀疑这与短路有关,但我仍然完全困惑。请帮忙。or
答:
0赞
user2357112
12/12/2022
#1
在 中,在 之前评估 的 LHS。执行此行时,它会在调用 之前计算并获取。flag = flag or recur(n+1)
or
recur(n+1)
recur(0)
flag
False
recur(1)
到返回时,是 ,但 的 LHS 已经被评估过了,所以 计算并得到 ,而不是 。recur(1)
flag
True
or
or
False or False
False
True
如果 的 LHS 被评估为 ,短路也会起作用,但这在本代码中从未发生过。or
True
评论
0赞
stackUnderflow
12/12/2022
谢谢!这很清楚!你们有什么建议可以让我读到这个评估程序吗?
0赞
user2357112
12/12/2022
@stackUnderflow:不完全是。有语言参考,但它是一种密集的阅读。
评论