gpt4 book ai didi

python - 在这种情况下,Python 如何避免无限递归?

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:56 27 4
gpt4 key购买 nike

我正在使用 this question 的公认答案更好地理解为什么有必要在 Python 中使用 if __name__=='__main__' 构造。我从答案中了解到,如果 foo.py 是使用 python foo.py 从命令行运行的,那么变量 __name__ 是分配了 '__main__' 的值,因此 if __name__=='__main__' block 中的所有内容都会被执行。

另一方面,如果模块是使用 import foo 从另一个脚本导入的,则 __name__ 会被分配一个值 "foo" .因此 if block 中的内容不会被执行。

答案然后显示了一个使用 foo2.pyfoo3.py 的示例,并建议比较结果。 foo2 的代码是:

# Suppose this is foo2.py.

def functionA():
print("a1")
from foo2 import functionB
print("a2")
functionB()
print("a3")

def functionB():
print("b")

print("t1")
if __name__ == "__main__":
print("m1")
functionA()
print("m2")
print("t2")

foo3 的代码是:

# Suppose this is foo3.py
def functionA():
print("a1")
from foo3 import functionB
print("a2")
functionB()
print("a3")

def functionB():
print("b")

print("t1")
print("m1")
functionA()
print("m2")
print("t2")

然后我分别使用 python foo2.pypython foo3.py 运行它们。这些是我得到的结果:

(base) D:\TEMP\try>python foo2.py
t1
m1
a1
t1
m1
a1
a2
b
a3
m2
t2
a2
b
a3
m2
t2

我对第二个(foo3.py)有点困惑。当 functionB 被导入时,我在期待

t1
m1
a1
t1
m1
a1
t1
m1
a1
... to infinity

因为在 functionA 中嵌套 functionB 会导致无限递归。然而 python “知道”以某种方式避免这种情况......

这里的逻辑是什么?这怎么不会发生?

最佳答案

Python import 语句很智能,可以跟踪已经导入的内容。

在您的程序是几个文件都需要一些 stdlib 模块(例如 os)的简单情况下,这会节省开销,因为您的程序会自行导入而无需重新导入所有重复的模块。

在这种情况下,第二次通过foo3,Python 知道foo3 已经导入,不会再次导入。

事实上它被加载了两次,一次作为__main__,一次作为foo3

关于python - 在这种情况下,Python 如何避免无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com