本篇文章是博主在AI、无人机、强化学习等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习:
AI学习笔记(2)---《一文弄懂 if __name__ == "__main__":(洒洒水啦!)》
一文弄懂 if __name__ == "__main__":(洒洒水啦!)
目录
1 举例看看:
小刚视角,即gang.py
小红视角,即hong.py
2 深入看看:
3 再往前走走:
大部分初学者在阅读python代码的时候,可能会看到 if __name__ == "__main__": 这行代码,对于这行代码可能不太了解,特别是对于从C、C++、 Java、C# 等编程语言学习转到Python学习的时候(哈哈,我就是其中的一位)。
先不解释这行代码所代表的含义,咱们先举个实例。
1 举例看看:
小刚的好朋友小红约小刚明天去吃螺蛳粉,小刚喜欢小红,一时口顺答应了,but小刚其实是不太想去吃的。
把小刚和小红都作为一个.py文件。现在小红和小刚都要执行了明天去吃螺蛳粉的事件,我们用print打印出来。
小刚
gang.py
#小刚
print("小刚明天去吃螺蛳粉")
小红
hong.py
#小红
print("小红明天去吃螺蛳粉")
小刚视角,即gang.py
由于小刚不想去吃螺蛳粉,小刚又不想让小红知道,小刚就只能心里想想。
心里想的话就放在 if __name__ == '__main__': 后面
在gang.py加上
if __name__ == '__main__':
后面执行他所想的事情
#小刚
print("小刚明天去吃螺蛳粉")
if __name__ == '__main__':
print('小刚心里想:不想吃螺蛳粉')
运行结果:
我们可以看到这里执行了 if __name__ == '__main__': 后面的 print,打印出了
小刚心里想:不想吃螺蛳粉
小红视角,即hong.py
小红邀请了小刚吃螺蛳粉,将这个动作认为使用 import 导入了 gang.py。
#小红
import gang
print("小红明天去吃螺蛳粉")
运行结果:
可以看到,小红只知道小刚和自己要去吃螺蛳粉,而不知道小刚的真实想法。
小刚心里想:不想吃螺蛳粉。
从代码层面上来说,hong.py使用 import 调用gang.py时。
if __name__ == '__main__':之前的语句被执行,之后的没有被执行。
2 深入看看:
我们在gang.py脚本的if __name__=="__main__":之前使用 print 将 __name__ 打印出来,
#小刚
print("小刚明天去吃螺蛳粉")
print(__name__)
if __name__ == '__main__':
print('小刚心里想:不想吃螺蛳粉')
则运行结果如下:
再执行 hong.py 呢?运行结果如下:
可以观察到:
- gang.py执行后变量__name__的值为"__main__"
- hong.py执行后变量__name__的值为"gang"。回归到 if 条件判断本身,因为不满足__name__=="__main__"的条件,因此,无法执行其后的代码。
原理如下:
由于每个Python文件都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。
如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。
而“__main__”等于当前执行文件的名称(包含了后缀.py)。(“__main__” = 文件名.py )
所以当模块被直接执行时,__name__ == '__main__' 结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就是不调用对应的方法。
简而言之就是:__name__ 是当前模块名,当模块被直接运行时,用 __main__ 代表模块名,if 判断满足,后面代码将被运行。
当模块是被导入时,if 判断不满足代码不被运行。
3 再往前走走:
涉及到了一个程序入口的概念
对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++, Java,C# 等。
其中C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样的,Java 和 C# 则必须要有一个包含 Main 方法的主类来作为程序入口。
但和C,C++、Java 以及 C# 等有所不同的是,Python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,python是动态的逐行解释运行,也就是从脚本第一行开始运行,没有统一的入口。
另外,python文件有两种使用方法:
- 第一种:直接作为脚本执行
- 第二种:import到其他的python脚本中被调用(模块重用)执行,也就是作为模块(库)被导入执行
但是,不管是直接运行还是导入,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。但实际使用过程中,python文件作为模块被其它python脚本调用执行的时候,有的代码我们是不希望被运行的。
而if __name__ == '__main__' 的作用就是定义这两种情况执行代码的执行方式,在该语句下的代码只有在文件作为脚本直接执行情况下才会被执行,而import到其他脚本中是不会被执行的。
那么弄懂了吗?朋友们
本文部分内容抄录和借鉴下面两篇文章,大家可以看看:
Python编程中的if __name__ == 'main' 的作用和原理
if __name__ == ‘__main__‘的详细讲解
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者关注VX公众号:Rain21321,联系作者。