我正在尝试修改不同模块中的变量。修饰符方法也在该模块中。显然,上下文发生了变化,修改不会持续存在。
测试1.py
from Test2 import *
function()
print var
测试2.py
var = 0
def function():
global var
var = 1
如果我执行 Test1.py,即使函数已执行,结果始终为 0。
解决这个问题的两种方法是:
- 调用函数后再次导入内容
- 将导入语句替换为“import Test2”并添加对 Test2 的任何调用的路径。
这些解决方案有效,但我想了解为什么会发生这种情况,为什么上下文在导入变量时不混合变量。
最佳答案
从另一个模块导入很像赋值,Test1
中的 var
变量没有赋值给 when 中的
被分配给。var
Test2
表达式 from Test2 import *
在底层做了这个:
- 加载
Test2.py
文件(如果尚未加载),创建sys.modules['Test2']
模块对象。如果该对象已存在,则跳过此步骤。 - 列出
sys.modules['Test2']
模块对象的所有公共(public)属性。公共(public)名称是任何不以_
开头的名称。如果有一个__all__
属性。 在绑定(bind)到这些对象的当前命名空间中添加名称:
var = sys.modules['Test2'].var function = sys.modules['Test2'].function
请注意,这些是 新分配,sys.modules['Test1']
或 `sys.modules['main' ] 模块。
在 Test2
中分配给全局 var
然后只设置 sys.modules['Test2'].var
,方式与
var = 1
var2 = var
var = 2
不会改变var2
。
另一方面,如果您仅将 Test2
模块作为全局模块导入
import Test2
那么您实际上是在要求 Python 使用 Test2 = sys.modules['Test2']
,并且从那里开始 Test2.var
正在引用 与 Test2
模块内的 var
相同的变量。这与您这样做的方式相同:
class Test2:
var = 0
@classmethod
def method(cls):
cls.var = 1
test2 = Test2()
test2.method()
print(test2.var)
关于python:导入的模块处于不同的上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31805761/