模块持有变量,可变与不可变

0 投票
2 回答
901 浏览
提问于 2025-04-17 10:37

好的,情况是这样的。我需要一组全局变量,目前为止这些变量没有必要去改变。但是现在出现了一些情况,我需要做一些类似这样的事情:

from config import some_var
some_var = new_var

而这个变化应该在之后的所有导入中都能看到。我尝试了一些简单的模块:

在 a.py 文件中:

x = 1
y = [1]

class A():
    x = 1
    y = [1]

在 b.py 文件中:

from a import A, x, y

def change():
    x = 2
    y[0] = 2
    A.x = 2
    A.y = [2]

还有主测试:

from a import A, x, y
from b import change

print x
print A.x
print y
print A.y
change()
print x
print A.x
print y
print A.y

输出结果是:

1
1
[1]
[1]
1
2
[2]
[2]

现在我只是想确认一下,在做任何草率的修改之前,因为我在配置中定义了很多变量,并且它们在很多地方都被使用。如果我决定把它们都放到一个类里使用,那将需要大规模的重构。

难道不可以以某种方式改变在模块中定义的变量,使得未来的导入能看到这个变化吗?我猜在我的例子中,y 的变化之所以有效,是因为只保留了对列表的引用,对吧?

2 个回答

0

在程序运行时,改变一个变量的值并不会影响到导入这个模块的文件里的内容。也就是说,以后再导入这个模块时,看到的还是文件里原来的内容。

7

你可以在模块级别改变变量,但前提是你要导入这个模块,而不是直接导入变量。

当你这样做的时候:

from a import A

其实只是给你当前的命名空间里分配了一个名字 A,并把它设置为 a.A 的值。如果你接着这样做:

a = 2

那么本地的名字就简单地被重新绑定到 2,但 a.A 的值还是保持不变。

但是如果你这样做:

import a

此时 a 就变成了对模块的引用,而 a.A 则指向那个模块里面的实际变量。所以现在:

a.A = 2

这将改变模块里面变量的值,并且这个变化在任何地方都能看到(只要其他地方也导入了模块,而不是仅仅引用了名字)。

撰写回答