python 中函数内递归函数的作用域

scoping of recursive functions within functions in python

为什么以下工作:

def rec(a, b, c):
    global nmb_calls
    nmb_calls += 1
    # other stuff
    rec(...)

p_list = []
nmb_calls = 0 
rec(a=p_list, b, c)
print(p_list)

但是类似:

def rec(a, b, c):
    nonlocal nmb_calls
    nmb_calls += 1
    # other stuff
    rec(...)

def call_rec(usr_b):
    p_list = []
    nmb_calls = 0
    rec(a=p_list, b=usr_b, c)
    return p_list

失败并出现错误:SyntaxError: no binding for nonlocal 'nmb_calls' found

我认为 nonlocal 意味着 rec 会在封闭范围(call_rec 的范围)中查找,找到 nmb_calls 并使用它?

第二种情况不起作用的原因是您在 call_rec 中调用它的方式不是适用于非本地的封闭范围。你必须做类似下面的事情来调用 rec() using nonlocal for nmb_calls:

def enclosing_function():
    def rec(a, b, c):
        nonlocal nmb_calls
        nmb_calls += 1
        # other stuff
        #rec(...)

    p_list = []
    nmb_calls = 0
    rec(a=p_list, b=usr_b, c=None)
    return p_list

另外,请注意,如果不指定 c 参数,就不能像调用 a 和 b 那样调用 rec。

所以这行不通:

rec(a=p_list, b=usr_b, c)

但你可以反过来做:

rec(a, b, c=None)