【问题标题】:python: imported module is in a different contextpython:导入的模块在不同的上下文中
【发布时间】:2015-10-26 15:36:29
【问题描述】:

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

Test1.py

​​>
from Test2 import *

function()
print var

Test2.py

​​>
var = 0

def function():
    global var
    var = 1

如果我执行 Test1.py,即使函数已经执行,结果也始终为 0。

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

  1. 调用函数后再次导入内容
  2. 将导入语句替换为“import Test2”,并将路径添加到对 Test2 的任何调用。

这些解决方案有效,但我想了解为什么会发生这种情况,为什么上下文在导入变量时不会混合它们。

【问题讨论】:

  • 这不起作用,因为您在Test1 中创建了一个新引用var,该引用在Test2.var 被反弹时不会更新。不要使用from module import *,而是使用import module,这样您就可以继续使用相同的引用。

标签: python variables import module


【解决方案1】:

从另一个模块导入很像赋值,当 Test2 中的 var 被赋值时,Test1 中的 var 变量不会被赋值。

表达式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['ma​​in'] 模块。

Test2 中分配给var 全局,然后只设置sys.modules['Test2'].var,方式相同

var = 1
var2 = var
var = 2

不会改变var2

另一方面,如果您只将Test2 模块作为全局变量导入

import Test2

那么您实际上是在要求 Python 使用 Test2 = sys.modules['Test2'],并且从那时起,Test2.varTest2 模块中引用了与 var 相同的变量。这与您执行此操作的方式相同:

class Test2:
    var = 0

    @classmethod
    def method(cls):
        cls.var = 1

test2 = Test2()
test2.method()
print(test2.var)

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多