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)

当解释器读取AB尚未定义,但此代码不会给我一个错误

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会在编译时被捕获,但大多数其他错误( NameErrorValueError等)只会在运行时被捕获,然后才会被调用。

“如果我写了一个函数,如果它没有在我的测试中调用......” - 这就是为什么你应该测试一切。

一些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?