彻底理解python中的 if __name__ == '__main__':

前言

一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。if__ name__== ‘__ main__’:的作用就是控制这两种情况执行代码的过程。在if __ name__ ==’__ main__’:下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。

程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如C、C++、等。如果你接触过这些语言,对于程序入口这个概念应该很好理解。C、C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。

而Python则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。在python中,一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。

直接作为脚本执行

如果判断出__name__的值是 __ main __,就说明这里是程序入口,而非被别的 py 文件 import。例如:

print("I am A!")
if __name__ == '__main__':
   print("I am B!")

这里的运行结果是:
在这里插入图片描述程序从上到下按顺序运行。

那么这个 __ name __ 是来干嘛的,把 if __ name __ == ‘__ main __’ 去掉。不也能照样运行?

print("I am A!")
#if __name__ == '__main__':
print("I am B!")
   

输出结果:
在这里插入图片描述
问题是对的,可以运行。

如上,我们可以看到if __name __ == ’ __ main __'相当于Python模拟的程序入口,Python本身并没有这么规定,这只是一种编码习惯。由于模块之间相互引用,不同模块可能有这样的定义,而程序入口只有一个。到底哪个程序入口被选中,这取决于name的值。

print("I am A!")
#if __name__ == '__main__':
print("I am B!")
print("__name__的值:",__name__)   

输出结果:
在这里插入图片描述
__ name __ 是模块内置的一个属性, 一般如果模块是被引用的时候, 它的值是模块名, 如果这个python文件被直接运行, 那么它的值是’__ main __’

模块重用执行

不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。

例子举例:

test1.py

print("I am A!")
if __name__ == '__main__':
   print("I am B!")

输出:

在这里插入图片描述
如果test1.py作为test2.py的模块被导入,则test1.py的if __ name __ == ‘__ main __’: 之后的代码不会被执行。

test2.py

#test2.py

import test1
if __name__ == '__main__':
    print("I am C!")

输出结果:
在这里插入图片描述

总结

当你的 .py 作为模块给别人使用,提供一些便利。为了不让别人一导入你的模块就直接运行整个脚本。那么使用 if __ name __ == ‘__ main __’ 其中的代码就不会在被 import 时被执行。

欢迎留言补充。

参考:https://stackoverflow.com/questions/419163/what-does-if-name-main-do

在这里插入图片描述
(微信公众号【程序猿编码】)

在这里插入图片描述

(添加本人微信号,备注加群,进入程序猿编码交流群,回复:领取学习资料,获取每日干货)

欢迎关注 微信公众号【程序猿编码】,专注于Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。还有每日00:10分之前更新 新闻简报,一份【简报】,纵览天下事!

发布了131 篇原创文章 · 获赞 115 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/chen1415886044/article/details/104855539