簡體   English   中英

Python:從另一個文件中更改全局變量

[英]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模塊的命名空間中獲取ADDRESSchange_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM