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 语句,为假的(判断语句条件不满足),当然不执行喽!

各位同学明白了么!~

------本文结束 感谢阅读------