代码之家  ›  专栏  ›  技术社区  ›  user32882

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

  •  1
  • user32882  · 技术社区  · 5 年前

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

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

    谢谢。

    1 回复  |  直到 5 年前
        1
  •  4
  •   Adam Smith jeffpkamp    5 年前

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

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

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

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

        2
  •  -1
  •   Muhammad Usama Salem    5 年前

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

        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中的部分。它将只导入您期望的函数,否则它将包括未在任何函数中定义的部分。 希望如此,它是有意义的,你将得到所需的输出!谢谢。