导入自身的 Python 程序

13r*_*s27 2 python recursion circular-dependency python-3.x

我在其中创建了一个以challenge.py以下代码命名的文件:

import challenge

def main():
     print('Circular much...')

challenge.main()
Run Code Online (Sandbox Code Playgroud)

由此,我期望 python 由于导入正在运行的文件的循环导入而引发错误,但我发现在 python 3.7 和 3.8 上,该文件运行并打印了Circular much...两次。我会理解一次,因为这意味着文件的其余部分在导入时没有运行,我会理解递归错误,因为它在堆栈中无限地运行了challenge.main(),但我不明白为什么会这样打印两次然后停止?

Fre*_*son 5

通过以下方式跟踪:

import challenge
Run Code Online (Sandbox Code Playgroud)

好的,我们将import挑战.py。开始了...

    import challenge
Run Code Online (Sandbox Code Playgroud)

我们已经在导入challenge.py,所以我们不会再这样做了

    def main():
         print('Circular much...')
Run Code Online (Sandbox Code Playgroud)

main()在命名空间中定义了函数challenge。凉爽的。

    challenge.main()
Run Code Online (Sandbox Code Playgroud)

现在调用main()命名空间中的函数challenge。这版画圆了...。这是你的第一张照片。

现在我们又回到了主模块。

def main():
     print('Circular much...')
Run Code Online (Sandbox Code Playgroud)

这定义了main()全局命名空间中的函数(永远不会被调用)。

challenge.main()
Run Code Online (Sandbox Code Playgroud)

这会调用main()命名空间中的函数challenge,再次打印Circular much...

我们已经完成了。您的消息的两个打印件。

这有帮助吗?