简单来说,if __name__ == "__main__": 是 Python 程序的入口检查点。
它的主要作用是:区分“直接运行脚本”和“被当作模块导入”这两种情况。
1. 核心原理
每一个 Python 文件(模块)在运行时,Python 解释器都会自动定义一个内置变量 __name__:
- 当你直接运行这个脚本时(例如在终端输入
python script.py): Python 会把__name__赋值为"__main__"。 - 当这个脚本被其他文件导入时(例如
import script): Python 会把__name__赋值为脚本的文件名。
2. 代码示例演示
假设我们有一个文件叫 const.py:
# const.py
def add(a, b):
return a + b
# 下面这段代码我们只想在直接运行 const.py 时执行
# 不希望别人 import add 的时候也触发打印
if __name__ == "__main__":
print("正在直接运行 const.py")
result = add(10, 20)
print(f"测试结果是: {result}")
情况 A:直接运行 const.py
终端输入:python const.py
输出:
正在直接运行 const.py
测试结果是: 30
原因:此时 __name__ 等于 "__main__",if 成立。
情况 B:在另一个文件 main.py 中调用
# main.py
import const
print("这里是 main.py")
print(const.add(1, 2))
终端输入:python main.py
输出:
这里是 main.py
3
原因:当 main.py 导入 const 时,const.py 里的 __name__ 变成了 "const"。if 语句不成立,所以里面的 print 语句不会执行。
3. 为什么要这么用?(应用场景)
1. 防止“副作用”
如果你在写一个工具函数库,里面定义了很多函数。你可能想在文件末尾写一些测试代码来确保函数写对了。如果不加 if __name__ == "__main__":,别人一旦 import 你的文件,你的测试代码(比如打印、读写文件、连接数据库)就会自动运行,干扰别人的程序。
2. 提高性能
导入模块时,Python 会从头到尾执行一次该文件。把不需要的代码放在 if 块里,可以避免在被导入时执行不必要的计算。
3. 标准的项目结构
在专业的 Python 开发中,通常会把逻辑写在函数里,然后用 main() 函数作为入口:
def main():
# 程序的逻辑起点
pass
if __name__ == "__main__":
main()
总结
__name__是 Python 的一个内置变量。- 直接跑脚本:
__name__为"__main__"。 - 作为模块导入:
__name__为文件名。 if __name__ == "__main__":确保了只有在你手动运行该文件时,其中的代码块才会执行。