python中if __name__ == '__main__'的作用和原理

if name == ‘main‘: 的作用和原理

如果代码写得规范一些,通常会写上一句if __name__==’__main__:作为程序的入口,但似乎没有这么一句代码,程序也能正常运行。学到模块这一块的进候,终于弄明白了。
看代码:

1
2
if __name__ == '__main__':
pass

原理分析

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

新建一个py文件,命名为:test.py
代码如下:

1
2
3
4
5
6
7
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print('第一行内容')
print(__name__)
if __name__ == '__main__':
print('第二行内容')

直接在python环境下运行 test.py其结输出结果为:

1
2
3
第一行内容
__main__
第二行内容

可以看到:

1、if __name__ == '__main__': 代码前后的print语句内容都打印出来了。

2、name的值为 “__main__”

再新建一个文件,test1.py内容为:

1
2
3
4
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import test

内容很简单,就是导入了test这个文件(模块),并没有其它内容。

运行test1.py其打印结果为:

1
2
第一行内容
test

由此可以看出:

1、if __name__ == '__main__': 代码前边的print语句内容都打印出来了,而之后的则没有。

2、name的值为 “test”,为模块名字,也就是文件 test.py去掉文件后缀名。

为什么会是这样呢?

结论:

原来每个python模块(python文件,也就是此处的test.py和test1.py)都包含内置的变量name,当运行模块被执行的时候,name等于文件名(包含了后缀.py);如果模块被import到其他模块中,则name等于模块名称(不包含后缀.py)。而__main__始终等于当前执行文件的名称(包含了后缀.py)。

当模块被直接执行时

if __name__ == '__main__':结果为真,则执行,这句代码下边的语句。
换成人话: if test.py == test.py: 明摆着一毛一样啊。

作为模块import执行结果

if name == ‘main‘:`结果为假,则后边的语句都不执行。

换成人话: if test == test.py: 当然不一样的啊。一个是test一个是test.py这能一样么,明明少了.py,结果为假。if语句,为假的(判断语句条件不满足),当然不执行喽!

各位同学明白了么!~