为何Python模块自导入后执行会输出两个结果?
问题解答
为什么p.py会输出两行结果?
当你直接运行p.py脚本时,Python会执行两次整个文件的代码:
- 第一次是把
p.py作为**__main__模块**执行:- 定义
var = 0(属于__main__.var) - 调用
func(),函数内执行import p,此时Python发现p模块未被加载,会重新读取并执行p.py文件来生成p模块。
- 定义
- 第二次是把
p.py作为**p模块**执行:- 再次定义
var = 0(属于p.var) - 执行到
func()调用后的print(var),此时p.var已经被func()里的p.var = 15修改,所以输出15。
- 再次定义
- 等
p模块加载完成后,回到__main__模块的执行流程,执行__main__里的print(var),而__main__.var从未被修改过,始终是0,所以输出0。
简单来说:直接运行脚本文件时,import p会触发文件的二次执行,两次执行都调用了print(var),因此得到两行输出。
为什么终端__main__模块的代码只输出一行?
在终端交互式环境(或代码直接作为__main__执行时):
import __main__导入的就是当前正在运行的模块本身,不会重新加载执行整个代码。func()里修改的__main__.var = 15,直接修改了当前模块的全局变量var。- 后续执行
print(var)时,输出的就是已经被修改后的15,整个流程只执行了一次print(var),所以只有一行结果。
验证示例
你可以在p.py中添加打印模块名称的代码,直观看到两次执行的差异:
var = 0 print(f"当前模块: {__name__}, var = {var}") def func(): import p print(f"函数内导入的模块: {p.__name__}, p.var = {p.var}") p.var = 15 func() print(f"结束时模块: {__name__}, var = {var}")
运行后输出会显示:
当前模块: __main__, var = 0 当前模块: p, var = 0 函数内导入的模块: p, p.var = 0 结束时模块: p, var = 15 结束时模块: __main__, var = 0
内容的提问来源于stack exchange,提问作者Ice Cube
相关产品推荐
相关产品推荐

