最简单的理解就是这样:

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

  

  

if __name__ == '__main__'的作用和原理的更多相关文章

  1. Python 中if __name__ == '__main__': 的作用和原理

    转自https://blog.csdn.net/weixin_42660771/article/details/84035153 1.代码的功能 一个python的文件有两种使用的方法,第一是直接作为 ...

  2. if __name__ == 'main': 的作用和原理

    if __name__ == 'main': 功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行. if __na ...

  3. 浅析python 中__name__ = '__main__' 的作用

    引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  4. 【转】浅析python 中__name__ = '__main__' 的作用

    原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ ...

  5. 002_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. python小知识——__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  7. python __name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  8. 理解 python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  9. __name__ == "__main__"的作用是什么?

    问题: __name__ == "__main__" 的作用是什么? # Threading example import time, thread def myfunction( ...

随机推荐

  1. Hadoop 2.2 & HBase 0.96 Maven 依赖总结

    由于Hbase 0.94对Hadoop 2.x的支持不是非常好,故直接添加Hbase 0.94的jar依赖可能会导致问题. 但是直接添加Hbase0.96的依赖,由于官方并没有发布Hbase 0.96 ...

  2. 《DSP using MATLAB》示例Example 8.19

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  3. dda的fpga实现(转载)

    The general approach using DDAs will be to simulate a system of first-order differential equations, ...

  4. LG1155 双栈排序

    题意 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈\(S_1\)和\(S_2\),Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈\(S_ ...

  5. springboot中 简单的SpringMvc全局异常处理

    1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...

  6. 5.JMeter测试mysql数据库

    1.使用jmeter测试mysql数据库时,需要导入jar包,jar包网盘地址为:链接: https://pan.baidu.com/s/1-5-s7HccudT4GirpmBVn6Q 密码: bea ...

  7. Java中如何查看一个类依赖的包

    Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包?   测试语句:   public static void main(Strin ...

  8. java代码----------实现创建DataInputStream和DataOutputStream进行读写

    总结: 主要是 捕获异常 package com.a.b; import java.io.*; public class testData { public static void main(Stri ...

  9. kubernetes 学习 常用命令

    1  kubectl get nodes      #查看nodes节点情况 2  kubectl describe  node node_name_XXXX           # 查看nodes详 ...

  10. 简单IOCP例子

    使用IOCP模型编程的优点 ① 帮助维持重复使用的内存池.(与重叠I/O技术有关) ② 去除删除线程创建/终结负担. ③ 利于管理,分配线程,控制并发,最小化的线程上下文切换. ④ 优化线程调度,提高 ...