在我的主类中,我使用了另一个名为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。 我在这里缺少什么?
答案 0 :(得分:5)
所有from config import ADDRESS, change_address
所做的就是从ADDRESS
模块的命名空间中取出change_address
和config
并将其转储到您当前模块的名称中 - 空间。现在,如果您在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?