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

标签 python variables import module

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

测试1.py
from Test2 import *

function()
print var

测试2.py
var = 0

def function():
    global var
    var = 1

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

解决这个问题的两种方法是:

  1. 调用函数后再次导入内容
  2. 将导入语句替换为“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['ma​​in' ] 模块。

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/

相关文章:

Python/Pygame导入字体问题

Python有模块,c++有什么?

python - 指定时间评估是否会覆盖 RK45 方法选择的时间步长? (scipy.integrate.solve_ivp)

python - 回合制游戏坏了

python 类属性

csv - 如何加快neo4j中的大数据导入速度

python - selenium - 如何在框中输入值?

python - 使用 django F() 对象更新多列

java - 使用 switch 语句后变量不可用?

javascript - 如何使用 namespace 导入而不导入所有内容?