模块保存变量,可变与不可变

时间:2012-01-19 16:22:03

标签: python

好的,情况就是这样。我需要一组变量是全局的,到目前为止还没有必要改变它们。现在有些情况发生在我需要做的事情时:

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]

现在我只想在做任何仓促更改之前确定,因为我在config中定义了很多变量,并且它们在很多地方使用,所以如果我决定将它们全部包装在类中以使用它会采取一些重大的重构。

是否无法以将来导入中看到的方式更改模块中定义的变量?我在我的例子中猜测y的变化是否有效,因为只保留了对列表的引用,对吗?

2 个答案:

答案 0 :(得分:7)

您可以在模块级别更改变量,但仅限于导入模块而不是变量。

当你这样做时:

from a import A

所有发生的事情是在当前名称空间中分配名称A并将其设置为a.A的值。如果你那么做

a = 2

本地名称只是反弹到2,但a.A名称的值保持不变。

如果你这样做:

import a

a现在是对模块的引用,a.A引用该模块中的实际变量。所以现在:

a.A = 2

将更改该模块中变量的值,从任何地方都可以看到(只要其他地方也导入了模块而不是对名称的引用。)

答案 1 :(得分:0)

在运行时更改变量的值不会更改从中导入模块的文件中存储的内容。未来的导入将会看到文件中的内容。