Python import 时会重复执行模块代码吗?
为什么不会重复执行?¶
Python 导入模块时会经历三个步骤:
-
查找:在
sys.path里找.py或.so文件 -
加载:编译成字节码
-
执行:运行模块的顶层代码块(定义函数、类、变量等)
但关键在于——执行完的结果会被缓存到一个全局字典里:
之后任何地方再 import 这个模块,Python 都会先查 sys.modules,发现已经有了,就直接返回缓存对象,完全跳过执行步骤。
📦 一个直观验证¶
即使在不同文件里 import,或者在同一个文件 import 多次,效果都一样——只有第一次会看到打印。
🔄 例外:什么情况下会重新执行?¶
- 显式使用
importlib.reload
这常用于开发热更新,但日常业务代码几乎不用。
-
不同解释器进程,或不同 Python 实例 每个进程有自己的
sys.modules,所以每次重启程序当然会重新执行。 -
用奇怪的方式绕过缓存 比如直接操作
sys.modules删掉缓存项再 import,但这是作死操作,面试里不用提。
🧠 理解“顶层代码只执行一次”的意义¶
-
定义语句是执行的一部分:函数
def和类class也是运行时才创建的,但只会创建一次。 -
单例模式天然适配:模块里的全局变量就是模块唯一的实例。
-
避免副作用:不要在模块顶层做高开销、有副作用的事(如打开数据库连接),因为它们真的只会做一次,且会在第一次 import 时发生。
📌 总结图¶
👉 所以,Python 的 import 就是典型的“懒执行 + 强缓存”模式,保证模块代码不重复执行,同时让程序启动更快、内存更省。
这个机制也是 Python 项目组织代码时很可靠的一个基础特性。