You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python模块自导入后执行会输出两个结果?

问题解答

为什么p.py会输出两行结果?

当你直接运行p.py脚本时,Python会执行两次整个文件的代码:

  1. 第一次是把p.py作为**__main__模块**执行:
    • 定义var = 0(属于__main__.var)
    • 调用func(),函数内执行import p,此时Python发现p模块未被加载,会重新读取并执行p.py文件来生成p模块。
  2. 第二次是把p.py作为**p模块**执行:
    • 再次定义var = 0(属于p.var)
    • 执行到func()调用后的print(var),此时p.var已经被func()里的p.var = 15修改,所以输出15。
  3. 等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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:09:14