python中函数内的递归函数的范围

时间:2017-05-07 02:01:21

标签: python-3.x recursion scoping

为什么以下工作:

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并使用它?

1 个答案:

答案 0 :(得分:2)

第二种情况不起作用的原因是你在call_rec中调用它的方式不是一个适用于非本地的封闭范围。您必须执行以下操作,使用nonlocal为nmb_calls调用rec():

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

另外,只是抬头,你可以调用rec而不指定c参数,方法与a和b相同。

所以这不起作用:

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

但你可以这样做:

rec(a, b, c=None)