python:导入的模块位于不同的上下文中

时间:2015-08-04 09:39:35

标签: python variables import module

我正在尝试修改不同模块中的变量。修饰符方法也在该模块中。显然,上下文发生了变化,修改不会持续存在。

Test1.py

from Test2 import *

function()
print var

Test2.py

var = 0

def function():
    global var
    var = 1

如果我执行Test1.py,即使该函数已被执行,结果仍为0。

解决此问题的两种方法是:

  1. 在调用函数
  2. 后再次导入内容
  3. 用“import Test2”替换导入语句,并将路径添加到对Test2的任何调用。
  4. 这些解决方案有效,但我想了解为什么会发生这种情况,为什么上下文不会混合varibles,如果它们已被导入。

1 个答案:

答案 0 :(得分:1)

从其他模块导入很像分配,var中的Test1变量未分配到varTest2分配给。{/ 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)