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)
为什么以下工作:
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)