Python中if __name__=='__main__': 理解与总结(看这篇就够了,一文扫清疑惑!)
前言
在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
即:包.文件名
。
原文链接:
- Python中“if name==‘main’:”理解与总结
Python中if __name__=='__main__': 理解与总结(看这篇就够了,一文扫清疑惑!)相关推荐
- Python中“if __name__=='__main__':”理解与总结
具体详解参考文献: https://www.cnblogs.com/chenhuabin/p/10118199.html
- Python中if __name__ == '__main__':作用
Python中if __name__ == '__main__':作用 2012-03-22 11:52:40 分类: Python/Ruby #hello.py def sayHello(): st ...
- python 中if __name__ = '__main__' 的作用
python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...
- python中if __name__ == '__main__': 的解析
2019独角兽企业重金招聘Python工程师标准>>> python中if __name__ == '__main__': 的解析 当你打开一个.py文件时,经常会在代码的最下面看到 ...
- python基础之python中if __name__ == '__main__': 的解析
当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...
- python中 if __name__ == ‘__main__‘
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- python中的__name__=='__main__'如何简单理解(一)
1. 摘要: 通俗的理解_name_ == '_main_':假如你叫小明.py,在朋友眼中,你是小明(_name_ == '小明'):在你自己眼中,你是你自己(_name_ == '_main_') ...
- Python 中 if __name__ == '__main__': 的理解
1.这段代码的功能 一个 Python 的文件有两种使用的方法,第一是直接作为脚本执行,第二是 import 到其他的 Python 脚本中被调用(模块重用)执行.因此 if __name__ == ...
- python中if __name__ == ‘__main__‘:的简单理解
举例说明,这里有两个模块 # ni模块 print("这是1.") if __name__ == '__main__':print("这是2.")'''输出结果 ...
最新文章
- java面向对象认定的特征_Java面向对象的三大特征(一)
- java 实例变量初始化_java学习之实例变量初始化
- Android 高德地图在清除所有Marker,清除某一个MarKer
- 局域网服务器文件夹隐藏,局域网服务器共享文件夹访问权限设置win7隐藏无权限共享文件夹方法.docx...
- 职称计算机Word2003是考什么,2017年职称计算机考试word2003考点
- oracle fileline换行,Java中的换行符line.separator及file的separator
- 如何使用nginx配置SSL证书?
- Sql Server的艺术(二) SQL复杂条件搜索
- 学习笔记——微软的软件测试之道
- SQL Server无法连接到(local)问题的解决的方法
- 射极跟随器实验报告数据处理_射极跟随器实验报告 -
- ROS中使用RPLIDAR激光雷达
- vbs如何调用c语言函数,vbscript基础教程-自定义函数和过程
- Python代码加密方案总结(巨全面和详细)
- 离散数学学习笔记----命题逻辑的推理理论
- 推荐一款高颜值的第三方网易云播放器,支持网页版和客户端
- python批量处理1000+的excel文件
- 还在谈论云计算吗?算力网络来啦!!!
- 字符流何用, 字节流呢
- overflow: hidden的用法
热门文章
- 使用MesaSQLite入库CSV文件
- javaEE项目发布方法
- 一个拼凑sql,输出变量的 存储过程
- [转]Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis
- [转]2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)
- 设计模式16_策略模式
- 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
- 利用Python Matplotlib库做简单的视觉化(2)
- FISSA:融合项目相似度模型和自注意网络的时序推荐
- oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?