为什么以下工作:
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
并使用它?
答案 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)