写此文章的初衷在于笔者碰到一道题目如下:
“假设有Python程序文件a.py,其代码如下:
def main(): if __name__ == '__main__': print(1) else: print(2) main()
若将改程序文件直接运行结果为(),作为模块导入时得到结果为()”
在这里话不多说,直接跑一跑看答案。
可以看到结果分别是1和2。
那么接下来解释为什么是这样一个结果,首先需要说一个关于程序入口的问题。而if __name__ == '__main__'便可以理解为Python 模拟的程序入口,在作为脚本执行时,执行if __name__ == '__main__'下的代码,而作为模块被导入时,被导入的模块中的if __name__ == '__main__'下的代码则不会被执行。
说白了就是如果代码是直接执行的则执行if __name__ == '__main__'下的代码,如果代码时被导入的则不执行。
接下来,便是关于if __name__ == '__main__'中的 “ __name__ ”到底是什么,应该怎么理解。其实,__name__
是一个内置变量,用于表示当前模块的名字,当代码作为脚本执行时,其中的__name__是__main__,当代码作为模块导入时,其中的__name__是被导入的文件名。
举例如下:
a,b,c三个python文件,a,c分别是作为脚本执行,在b中将a,c 分别导入执行,可以清晰的看到在作为脚本执行时,__name__是__main__,作为模块导入时,其中的__name__是被导入的文件名。
故此,对文章开头提到的题目便可以很清晰的得到结果,第一次作为脚本执行,__name__是__main__,故而执行print(1),作为模块导入,__name__是a,故而执行print(2).
以上!
有关程序入口可以参考if __name__ == '__main__' 如何正确理解 - 姚红 - 博客园 (cnblogs.com)
比较详细。