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

为何test2未返回修改后的全局变量值?Python模块导入疑问

为什么test2没有输出修改后的value值?

相关代码与执行结果

t.py

value = 0

def change_value():
    global value
    value = 10

s.py

import t
from t import value

t.change_value()

print(f'test1: {t.value}')
print(f'test2: {value}')

输出

test1: 10
test2: 0


问题的核心在于Python中from module import var的工作机制:这种导入方式是把模块里的变量值复制到当前脚本的命名空间,而不是创建指向模块变量的引用。

具体执行流程:

  1. 当s.py执行from t import value时,Python会读取t模块里当前的value值(也就是0),然后在s.py自己的命名空间里新建一个名为value的变量,把0赋值给它。这时候两个value是完全独立的,只是初始值相同。
  2. 调用t.change_value()时,函数里的global value声明告诉Python要修改的是t模块全局命名空间里的value,所以t.value被改成了10,但这和s.py本地的value没有任何关联。
  3. 最后打印时,t.value是直接访问t模块里已经更新的变量,自然输出10;而value是访问s.py本地那个复制过来的变量,值还是最初的0。

解决方法

方法1:始终通过模块对象访问变量(推荐)

不要直接导入变量,而是导入模块后通过模块名访问,这样每次都是取模块里的最新值:

import t

t.change_value()

print(f'test1: {t.value}')
print(f'test2: {t.value}')

执行后两次都会输出10。

方法2:重新导入变量(不推荐,易造成混乱)

如果一定要用from导入,可以在修改后重新导入变量,覆盖本地的旧值:

import t
from t import value

t.change_value()
# 重新导入value,更新本地变量
from t import value

print(f'test1: {t.value}')
print(f'test2: {value}')

内容的提问来源于stack exchange,提问作者ABHIJITH EA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:31:02