为何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的工作机制:这种导入方式是把模块里的变量值复制到当前脚本的命名空间,而不是创建指向模块变量的引用。
具体执行流程:
- 当
s.py执行from t import value时,Python会读取t模块里当前的value值(也就是0),然后在s.py自己的命名空间里新建一个名为value的变量,把0赋值给它。这时候两个value是完全独立的,只是初始值相同。 - 调用
t.change_value()时,函数里的global value声明告诉Python要修改的是t模块全局命名空间里的value,所以t.value被改成了10,但这和s.py本地的value没有任何关联。 - 最后打印时,
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
相关产品推荐
相关产品推荐

