繁体   English   中英

模块包含变量,可变与不可变

[英]module holding variables, mutable vs immutable

好的,这是情况。 我需要一组变量是全局变量,到目前为止,无需更改它们。 现在,有些情况发生在我需要执行以下操作时:

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的更改有效,因为仅保留了对列表的引用,对吗?

您可以在模块级别更改变量,但是仅当您导入模块时才可以更改变量。

当您这样做时:

from a import A

所发生的一切只是在当前名称空间中分配了名称A并将其设置为aA的值。 如果你那么做

a = 2

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

但是,如果您这样做:

import a

a现在是所述模块的引用,并且aA是指模块内的实际变量。 所以现在:

a.A = 2

将更改该模块内部变量的值,该变量的值在任何地方都可见(只要其他位置也导入了该模块而不是对该名称的引用)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM