Weyu‘s blog

  • Python 脚本是如何执行的?
  • 什么是 __name__?
  • 为什么要写 if __name__ == "__main__"?
  • 一个更完整的示例结构
  • 如果一个文件里只有函数,没有入口会发生什么?
  • 小结
  • 首页
  • 代码
  • 作品
  • 学习
  • 折腾
  • 随笔
  • 关于博主
  • 时光映像
  • 我的网盘
  • 文章归档
  • 友情链接

Python 学习笔记: 理解内置变量:__name__

  • admin
  • 2025-05-26
  • 0

在 Java 中,程序的入口通常是显式声明的,例如 Java 的 main 方法。而 Python 并没有强制设定“主入口函数”,这让很多初学者在看到 if __name__ == "__main__" 这句代码时感到困惑。本文结合实际例子,从基础概念出发,逐步解释这句代码的含义及其使用场景。

Python 脚本是如何执行的?

Python 文件在被执行时,解释器会从文件的最上方开始,逐行执行未缩进的代码(也就是顶层代码)。比如下面的脚本:

print("Hello, world!")

直接保存为 hello.py 并运行,它会立即输出:

Hello, world!

这说明 Python 文件不需要包装在函数或类里,也能直接运行。

什么是 __name__?

每个 Python 模块(.py 文件)在执行时,解释器都会自动定义一个变量 __name__。

它的值取决于这个模块的运行方式:

运行方式__name__ 的值
脚本被直接运行"__main__"
脚本被其他模块导入模块名(不带 .py)

可以用一个简单的例子验证这一点:

# tool.py
print("当前 __name__ 为:", __name__)
  • 执行 python tool.py,输出为:当前 __name__ 为: __main__
  • 创建另一个文件 main.py,写入 import tool,运行后输出为:当前 __name__ 为: tool

这说明 __name__ 的值在不同情况下是不同的。

为什么要写 if __name__ == "__main__"?

这句判断的目的是:仅当当前文件是作为主程序运行时,才执行某些代码;如果它被别的文件导入,则不执行。

来看一个标准写法:

def main():
print("程序开始执行")

if __name__ == "__main__":
main()

如果你直接运行这个文件,会看到输出:

程序开始执行

但如果这个文件被其他脚本导入使用,例如:

# other.py
import your_script

就不会有任何输出。因为 __name__ != "__main__",所以 main() 不会被调用。

这在开发库或工具模块时非常有用,防止模块在被导入时自动执行一些测试代码或主流程逻辑。

一个更完整的示例结构

下面是一个较推荐的脚本结构,它既适合直接运行,也方便以后当作模块引用:

def 初始化():
print("正在初始化资源...")

def 主逻辑():
print("开始执行主程序逻辑...")

def main():
初始化()
主逻辑()

if __name__ == "__main__":
main()

结构清晰、逻辑明确,是实际开发中非常常见的组织方式。

如果一个文件里只有函数,没有入口会发生什么?

举个例子:

def say_hello():
print("Hello!")

如果你保存为 test.py 并直接运行它:

python test.py

会发现什么都不会输出。原因很简单:Python 只是定义了函数,并没有调用它。

这也正是为什么推荐使用 main() 函数并在 if __name__ == "__main__" 中调用它。

小结

  • Python 的顶层代码会在文件被运行时立即执行;
  • __name__ 是 Python 自动赋值的内置变量;
  • 当脚本被直接运行时,__name__ == "__main__";
  • 当脚本被其他模块导入时,__name__ 等于模块名;
  • 使用 if __name__ == "__main__" 可以避免在导入模块时执行主逻辑代码;
  • 建议将主流程写入 main() 函数中,再通过这句判断来决定是否调用。

这不仅让代码更清晰,也为模块化开发、单元测试提供了良好的基础。

© 2025 Weyu‘s blog
  • {{ item.name }}
  • {{ item.name }}