Python:从另一个文件中更改全局变量

时间:2017-12-05 19:08:44

标签: python

在我的主类中,我使用了另一个名为config.py的文件中定义的全局变量ADDRESS。 我想通过调用config.py中的函数来改变我的主类中的ADDRESS的值。

在我的主要课程中,我有:

from config import ADDRESS, change_address
change_address("192.168.10.100")
print("new address " + ADDRESS)

在我的配置文件中,我有以下内容:

ADDRESS = "0.0.0.0"

def change_address(address):
    global ADDRESS
    ADDRESS = address
    print("changed address to: " + ADDRESS)

配置文件中的print语句正确打印新地址192.168.10.100。 但是,我的主类中的print语句打印0.0.0.0。 我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

所有from config import ADDRESS, change_address所做的就是从ADDRESS模块的命名空间中取出change_addressconfig并将其转储到您当前模块的名称中 - 空间。现在,如果您在ADDRESS命名空间中重新分配config的值,则当前模块无法看到它 - 名称空间的工作方式。这就像做以下事情:

>>> some_namespace = {'a':1}
>>> globals().update(some_namespace)
>>> a
1
>>> some_namespace
{'a': 1}
>>> some_namespace['a'] = 99
>>> a
1
>>> some_namespace
{'a': 99}

最简单的解决方案?不要破坏名字空间:

import config
config.change_address("192.168.10.100")
print("new address " + config.ADDRESS)

答案 1 :(得分:0)

我建议您尽量不要更改模块中的全局状态。相反,我会重新编写代码,使config.py中的ADDRESS不会更改。如果应用程序的配置可以从调用更改为调用,我会将配置更改为:

ADDRESS = '0.0.0.0'

def get_default_config():
    return {'address': ADDRESS, 'some_other_config_value': 'foo'}

然后在主要我会这样做:

app_config = config.get_default_config()
app_config = "192.168.10.100"
print("new address " + app_config['address']

作为一般规则,更改其他模块中变量/常量的值不是一个好主意。

注意:您也可以创建一个配置类,以便您可以访问config.address等配置值。

我建议您阅读stackexchange帖子Why is Global State so Evil?