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

Bog*_*dan 0 python

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

from config import some_var
some_var = new_var
Run Code Online (Sandbox Code Playgroud)

此后,此更改应在所有导入中可见.现在我尝试了一些虚拟模块:

所以在a.py中

x = 1
y = [1]

class A():
    x = 1
    y = [1]
Run Code Online (Sandbox Code Playgroud)

在b.py

from a import A, x, y

def change():
    x = 2
    y[0] = 2
    A.x = 2
    A.y = [2]
Run Code Online (Sandbox Code Playgroud)

主要测试:

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
Run Code Online (Sandbox Code Playgroud)

输出是:

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

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

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

Dan*_*man 7

您可以在模块级别更改变量,但前提是您导入模块而不是变量.

当你这样做时:

from a import A
Run Code Online (Sandbox Code Playgroud)

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

a = 2
Run Code Online (Sandbox Code Playgroud)

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

但是如果你这样做:

import a
Run Code Online (Sandbox Code Playgroud)

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

a.A = 2
Run Code Online (Sandbox Code Playgroud)

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