python如何实现相互递归?
用C / Java背景移植到python,我最近不得不实现一个相互递归,但是Python中的某些东西让我感到困扰:
因为一个python程序是逐行解释的,如果我在同一个python文件中有两个函数:
def A(n):
B(n-1)
# if I add A(1) here, it gives me an error
def B(n):
if n <= 0:
return
else:
A(n-1)
当解释器读取A
, B
尚未定义,但此代码不会给我一个错误
TL; DR我的理解是,当解释def
时,python用{"function name": function address}
给一些本地名称空间locals()
添加一个条目,但是对于函数体来说,它只进行语法检查:
def A():
blabla # this will give an error
def B():
print x # even though x is not defined, this does not give an error
A() # same as above, NameError is only detected during runtime
SyntaxError
会在编译时被捕获,但大多数其他错误( NameError
, ValueError
等)只会在运行时被捕获,然后才会被调用。
“如果我写了一个函数,如果它没有在我的测试中调用......” - 这就是为什么你应该测试一切。
一些IDE会在各种情况下提出警告,但最好的选择仍然是自己进行彻底的测试。 这样,您还可以检查通过用户输入等因素产生的错误,IDE的自动检查不会涵盖这些错误。
B(n-1)
行B(n-1)
表示“执行此语句时,在模块范围内查找某个函数B
,然后使用参数n-1
调用它”。 由于在执行该功能时发生查找,因此B
可以稍后定义。
(另外,你可以用一个不同的函数完全覆盖B
,然后A
会调用新的B
,但这会导致一些令人困惑的代码。)
如果你担心没有捕获到不存在的函数的调用,你可以尝试使用静态分析工具。 除此之外,请确保您正在测试您的代码。
当解释器读取A时,B尚未定义,但此代码不会给我一个错误
从文档中可以找到python解释器没有给出错误的原因,这在技术上被称为前向参考:
自由变量的名称解析发生在运行时,而不是在编译时。
链接地址: http://www.djcxy.com/p/4085.html上一篇: How does python implement mutual recursion?
下一篇: Why serialVersionUID in java must be static, final, and of type long?