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 ,本文根据自己的理解有部分改动,感谢原作者的分享。

      

      

  • 相关阅读:
    Prime Time使用
    cache与MMU与总线仲裁
    IUS tcl cmd
    CPU cache
    generated clock
    PL301 matrix内部模块
    014-数据结构-树形结构-基数树、Patricia树、默克尔树、梅克尔帕特里夏树( Merkle Patricia Tree, MPT)
    001-软件架构概览、maven补充【分包工程、合并包、web容器插件】、git补充
    013-数据结构-树形结构-决策树
    012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树
  • 原文地址:https://www.cnblogs.com/schut/p/9130146.html
Copyright © 2011-2022 走看看