我正在尝试修改不同模块中的变量。修饰符方法也在该模块中。显然,上下文发生了变化,修改不会持续存在。
from Test2 import *
function()
print var
var = 0
def function():
global var
var = 1
如果我执行Test1.py,即使该函数已被执行,结果仍为0。
解决此问题的两种方法是:
这些解决方案有效,但我想了解为什么会发生这种情况,为什么上下文不会混合varibles,如果它们已被导入。
答案 0 :(得分:1)
从其他模块导入很像分配,var
中的Test1
变量未分配到var
中Test2
分配给。{/ p >
表达式from Test2 import *
执行此操作:
Test2.py
文件(如果尚未加载),创建sys.modules['Test2']
模块对象。如果该对象已存在,则跳过此步骤。sys.modules['Test2']
模块对象上的所有公共属性。公共名称是指不以_
开头的任何内容。如果有__all__
属性。在绑定到这些对象的当前命名空间中添加名称:
var = sys.modules['Test2'].var
function = sys.modules['Test2'].function
请注意,这些是新作业,sys.modules['Test1']
或`sys.modules [&#39; 主&#39;]模块。< / p>
分配到var
内的Test2
全局,然后只设置sys.modules['Test2'].var
,方式与
var = 1
var2 = var
var = 2
不会改变var2
。
另一方面,如果您只使用
导入Test2
模块作为全局模块
import Test2
那么你真的要求Python使用Test2 = sys.modules['Test2']
,并且从Test2.var
开始在var
内引用相同的变量作为Test2
模块。这与您完成此操作的方式相同:
class Test2:
var = 0
@classmethod
def method(cls):
cls.var = 1
test2 = Test2()
test2.method()
print(test2.var)