我正在使用接受的答案
this question
为了更好地理解为什么需要使用
if __name__=='__main__'
用python构造。我从答案中了解到,如果
foo.py
从命令行运行时使用
python foo.py
然后是变量
__name__
分配的值为
'__main__'
所以里面的一切
如果uuu name_uuu==''uu main_uuu'
块被执行。另一方面,如果模块是使用
import foo
然后
第二代
分配的值为
"foo"
. 所以里面的东西
if
未执行块。
然后,答案显示了一个使用
foo2.py
和
foo3.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.py
和
python 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
我对第二个有点困惑(
Fo.3.Py
)什么时候?
functionB
我期待的进口货
t1
m1
a1
t1
m1
a1
t1
m1
a1
... to infinity
筑巢以来
函数B
在里面
functionA
将导致无限递归。然而,python“知道”以某种方式避免了这一点…
这里的逻辑是什么?这是怎么发生的?
谢谢。