模块持有变量,可变与不可变
好的,情况是这样的。我需要一组全局变量,目前为止这些变量没有必要去改变。但是现在出现了一些情况,我需要做一些类似这样的事情:
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
这将改变模块里面变量的值,并且这个变化在任何地方都能看到(只要其他地方也导入了模块,而不是仅仅引用了名字)。