前言

在Python当中,如果代码写得规范一些,通常会写上一句if '__name__'=='__main__:'作为程序的入口,但似乎没有这么一句代码,程序也能正常运行。这句代码多余吗?原理又在哪里?本篇博文对此进行总结说明。

一、程序入口

学过Java、C、C++的程序员应该都知道,每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数。如下所示, main()就是Java中的一个main函数。

public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld");}
}

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同于要将所有代码先编译成中间代码,Python程序运行时是逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。

在某种意义上讲,if '__name__'=='__main__:'也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这也是if '__name__'=='__main__:'这条代码的意义之一。

二、模块导入

我们知道,当我们把模块A(即:A.py文件)中的代码在模块B(即:B.py文件)中进行import A时,只要B模块代码运行到该import语句,模块A的代码会被执行。

模块A

# 模块Aa = 100print('你好,我是模块A……')print(a)

模块B

# 模块Bfrom package01 import Ab = 200print('你好,我是模块B……')print(b)

运行模块B时,输出结果如下:

你好,我是模块A……100你好,我是模块B……200

如果在模块A中,我们有部分的代码不想在被导入到B时直接被运行,但在直接运行A时可直接运行,那该怎么做呢?那就可以用到if '__name__'=='__main__:'这行代码了,我们对上面用到的A模块代码进行修改:

# 模块Aa = 100print('你好,我是模块A……')if __name__=='__main__':print(a)

B模块不做修改,直接执行B模块,输出结果如下:

你好,我是模块A……# 此处没有输出a模块中的100你好,我是模块B……200

看到了吗,A模块中的a的值就没有再被输出了。所以,当你要导入某个模块,但又不想改模块的部分代码被直接执行,那就可以这一部分代码放在if '__name__'=='__main__:'内部。

三、__name__与__main__关系

看到现在也许心中还是疑惑,为什么会这样,那么现在我们来说一说if '__name__'=='__main__:'的原理。
__name__是Python的内置变量,用于指代当前模块。我们修改上面用到的A模块和B模块,在模块中分别输出模块的名称:

模块A:

# 模块Aprint('你好,我是模块A……')print('模块A中__name__的值:{}'.format(__name__))print('-------------------------')

模块B:

# 模块Bfrom package01 import Aprint('你好,我是模块B……')print('模块B中__name__的值:{}'.format(__name__))

执行A模块时,输出结果:

你好,我是模块A……模块A中__name__的值:__main__-------------------------

执行B模块时,输出结果:

你好,我是模块A……模块A中__name__的值:package01.A  # 注意此处-------------------------你好,我是模块B……模块B中__name__的值:__main__

发现神奇之处了吗?当哪个模块被直接执行时,该模块__name__的值就是__main__,当被导入另一模块时,__name__的值就是模块的真实名称。

用一个类比来解释一下:记得小时候要轮流打算教室,轮到自己的时候(模块被直接执行的时候),我们会说今天是“我” (__main__)值日,称呼其他人时,我们就会直接喊他们的名字。所以,__main__就相当于当事人,或者说第一人称的“我”。

所以,当运行if '__name__'=='__main__':语句时,如果当前模块时被直接执行,__name__的值就是__main__,条件判断的结果为True,if '__name__'=='__main__':下面的代码块就会被执行。

四、总结

对于if '__name__'=='__main__:'

  • 包含此语句的A.py文件直接运行时,__name__值为__main__
  • 包含此语句的A.py文件被B.py文件作为导入(from package import A)文件,执行B从而间接执行A时,__name__值不为__main__,为package.A即:包.文件名

原文链接:

  1. Python中“if name==‘main’:”理解与总结

Python中if __name__=='__main__': 理解与总结(看这篇就够了,一文扫清疑惑!)相关推荐

  1. Python中“if __name__=='__main__':”理解与总结

    具体详解参考文献: https://www.cnblogs.com/chenhuabin/p/10118199.html

  2. Python中if __name__ == '__main__':作用

    Python中if __name__ == '__main__':作用 2012-03-22 11:52:40 分类: Python/Ruby #hello.py def sayHello(): st ...

  3. python 中if __name__ = '__main__' 的作用

    python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...

  4. python中if __name__ == '__main__': 的解析

    2019独角兽企业重金招聘Python工程师标准>>> python中if __name__ == '__main__': 的解析 当你打开一个.py文件时,经常会在代码的最下面看到 ...

  5. python基础之python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  6. python中 if __name__ == ‘__main__‘

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

  7. python中的__name__=='__main__'如何简单理解(一)

    1. 摘要: 通俗的理解_name_ == '_main_':假如你叫小明.py,在朋友眼中,你是小明(_name_ == '小明'):在你自己眼中,你是你自己(_name_ == '_main_') ...

  8. Python 中 if __name__ == '__main__': 的理解

    1.这段代码的功能 一个 Python 的文件有两种使用的方法,第一是直接作为脚本执行,第二是 import 到其他的 Python 脚本中被调用(模块重用)执行.因此 if __name__ == ...

  9. python中if __name__ == ‘__main__‘:的简单理解

    举例说明,这里有两个模块 # ni模块 print("这是1.") if __name__ == '__main__':print("这是2.")'''输出结果 ...

最新文章

  1. java面向对象认定的特征_Java面向对象的三大特征(一)
  2. java 实例变量初始化_java学习之实例变量初始化
  3. Android 高德地图在清除所有Marker,清除某一个MarKer
  4. 局域网服务器文件夹隐藏,局域网服务器共享文件夹访问权限设置win7隐藏无权限共享文件夹方法.docx...
  5. 职称计算机Word2003是考什么,2017年职称计算机考试word2003考点
  6. oracle fileline换行,Java中的换行符line.separator及file的separator
  7. 如何使用nginx配置SSL证书?
  8. Sql Server的艺术(二) SQL复杂条件搜索
  9. 学习笔记——微软的软件测试之道
  10. SQL Server无法连接到(local)问题的解决的方法
  11. 射极跟随器实验报告数据处理_射极跟随器实验报告 -
  12. ROS中使用RPLIDAR激光雷达
  13. vbs如何调用c语言函数,vbscript基础教程-自定义函数和过程
  14. Python代码加密方案总结(巨全面和详细)
  15. 离散数学学习笔记----命题逻辑的推理理论
  16. 推荐一款高颜值的第三方网易云播放器,支持网页版和客户端
  17. python批量处理1000+的excel文件
  18. 还在谈论云计算吗?算力网络来啦!!!
  19. 字符流何用, 字节流呢
  20. overflow: hidden的用法

热门文章

  1. 使用MesaSQLite入库CSV文件
  2. javaEE项目发布方法
  3. 一个拼凑sql,输出变量的 存储过程
  4. [转]Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis
  5. [转]2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)
  6. 设计模式16_策略模式
  7. 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
  8. 利用Python Matplotlib库做简单的视觉化(2)
  9. FISSA:融合项目相似度模型和自注意网络的时序推荐
  10. oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?