[英]Python: change global variable from within another file
在我的主類中,我使用了另一個名為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。 我在這里錯過了什么?
所有from config import ADDRESS, change_address
所做的就是從config
模塊的命名空間中獲取ADDRESS
和change_address
,並將其轉儲到當前模塊的名稱空間中。 現在,如果在config
的命名空間中重新分配ADDRESS
的值,那么當前模塊將無法看到它 - 這就是名稱空間的工作方式。 這就像做以下事情:
>>> 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)
我建議您盡量不要更改模塊中的全局狀態。 相反,我會重寫代碼,使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帖子為什么Global State如此邪惡?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.