简单来说,这句话的作用就是判断你执行的是不是当前文件?如果是,则执行if块里面的,如果不是就不会执行。
是不是有些拗口,什么叫我执行的是不是当前文件?这就得从python的模块概念说起。
首先得先明白python是一个解释型语言,它与C不一样并不是先全部编译并链接好再进行执行的,而是从你运行的那个模块的最顶行开始,逐行解释执行。所以,最顶层(没有被缩进)的代码都会被执行,而我们import module
的操作就是把module
这个模块导入到当前模块里面,并且把它执行一遍。可以通过例子理解下:
1 | # test1.py |
1 | # main_test.py |
从输出结果判断我们可以看出,确实是导入module再执行module,然后继续往下执行。
[^tips]: 如此一来,我们也能理解在很多python项目中使用方法为什么一般都是from XXX import XXX,如果直接import,开销也就太大了。
每次import都会把导入的模块执行一遍,但又不是所有的模块都只有函数,如果里面有输出或者其他操作,这些又不是我需要的,怎么处理呢。简而言之,如何避免某些代码在模块被导入后被执行? — 这恰恰是 if __name__ == '__main__'
的作用。
__name__
是python的一个内置属性,其用于标识当前模块的名称。当一个模块被直接执行时,其名称被设置为 "__main__"
。而当一个模块被导入到其他模块中时,其名称则被设置为模块的实际名称。这里可以举例理解
1 | # main_test.py |
1 | # test1.py |
了解了__name__
是什么,那么if __name__ == '__main__'
的作用就显而易见了。就是判断当前执行的模块是不是我,如果不是,我后面的程序就不执行,如果是就执行。