社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

user32882 • 6 年前 • 426 次点击  

我正在使用接受的答案 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“知道”以某种方式避免了这一点…

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

谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31392
 
426 次点击  
文章 [ 2 ]  |  最新文章 6 年前
Muhammad Usama Salem
Reply   •   1 楼
Muhammad Usama Salem    6 年前

好吧,我得到了什么,我在我的机器上也运行了同样的代码。和我在一起,以便更好地理解!谢谢你!

    def functionA():
        print("------------")
        from foo3 import functionB
        print("a2")
        functionB()
        print("a3")

    def functionB():
        print("b")
    if __name__ == "__main__":
        print("coming")
        print("t1")
        print("m1")
        functionA()
        print("m2")
        print("t2")

如果您输入每个函数名,那么它就不会执行main中的部分。它将只导入您期望的函数,否则它将包括未在任何函数中定义的部分。 希望如此,它是有意义的,你将得到所需的输出!谢谢。

Adam Smith
Reply   •   2 楼
Adam Smith    6 年前

蟒蛇 import 语句很聪明,可以跟踪已经导入的内容。

在您的程序是几个需要stdlib模块的文件的普通情况下( os 例如,这节省了开销,因为您的程序在不重新导入所有重复模块的情况下导入自己。

foo3 ,巨蟒知道 三氧化二铝 已导入,不再执行导入操作。

事实上,它被加载两次,一次作为 __main__ 一次 三氧化二铝 .