zoukankan      html  css  js  c++  java
  • if __name__ == '__main__'的作用和原理

    最简单的理解就是这样:

        __name__ 是当前模块名,当模块被直接运行时,模块名为 __main__。

        所以 if __name__ == '__main__' 这句话的意思就是当前模块被直接运行时,以下代码将被执行,

      当模块是被其它程序导入时,代码块不会被执行。

    1️⃣  举例分析

      第一步,新建一个.py文件。命名为 test.py,写入如下代码:

    # -*-coding:utf-8  -*-
    
    print('测试程序--函数外')
    
    def main():
        print('测试程序--函数内')
    
    if __name__ == '__main__':
        main()
        print('hello world')

      运行后,输出如下:

    测试程序--函数外
    测试程序--函数内
    hello world

      第二步,在同一个文件夹下,新建一个文件,命名为 import_test.py,写入代码如下:

    # -*-coding:utf-8 -*-
    
    import test

      运行后结果如下:

    测试程序--函数外

      通过对比不难发现,import_test.py与之前的test.py相比,只输出了 “测试程序--函数外”,也就是意味着 if __name__ == "__main__": 之前的语句被执行,

    之后的没有执行。

      这是为什么呢?我们接着来分析!

      我们在 test.py程序中 if __name__ == "__main__":之前加入如下代码: 

    print(__name__) # 将 __name__指定的内容打印出来

      现在test.py程序运行的结果如下:

    测试程序--函数外
    __main__    # 打印__name__的结果
    测试程序--函数内
    hello world

      可以看出,此时变量__name__的值为"__main__"。

      又到了对比的时候了,运行 import_test.py 程序,见证奇迹的时刻!

      import_test.py代码如下:

    # -*- coding:utf-8-*-
    
    import test

      结果如下:

    测试程序--函数外
    test          # 导入后,print(__name__)指向的是被导入的模块名

      此时,import_test.py中的__name__变量值为 test,不满足 __name__ == "__main__"的条件,因此,无法执行 if __name__ == "__main__": 后面的代码。

    2️⃣  原理分析

      具体原理如下: 

    由于每个Python模块(Python文件)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py)。所以当模块被直接执行时,__name__ == '__main__'结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就不调用对应的方法。

      简而言之

    _name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行。

    原文出自  https://mp.weixin.qq.com/s/QlLziPsuBO2rI0Q__xs9TQ ,本文根据自己的理解有部分改动,感谢原作者的分享。

      

      

  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/schut/p/9130146.html
Copyright © 2011-2022 走看看