簡體   English   中英

如何將 init.py 中修改后的全局變量訪問到另一個模塊中?

[英]How to Access modified global variable in init.py into another module?

我正在尋找一種 pythonic 方法來訪問在 __init__.py 文件中定義的全局變量(profit_benchmark),並且它的值在一個模塊(routines.py)中修改,現在我想在另一個模塊中使用修改后的值訪問贏利基准模塊(網絡.py)

這是我的文件夾結構:

在此處輸入圖片說明

__init__.py

profit_benchmark = 50

例程.py

from so import profit_benchmark
profit_benchmark = 60

網絡.py

from so import profit_benchmark
print(profit_benchmark)

輸出:

50

我期望輸出為 60,因為在routine.py 中修改了變量利潤基准

我的問題:如何訪問 network.py 中的 Profit_benchmark 變量的新值,以便輸出為 60

第一件事:Python 沒有真正的全局變量,只有模塊級全局變量——每個模塊都是一個不同的命名空間,全局變量只是它定義的模塊的“全局”。

第二件事: import語句與 C 或 PHP include - 它不會在導入模塊中“復制”整個導入的模塊,而是加載導入的模塊(如果尚未加載)並使其可用在導入命名空間中

其實這個:

import so

是捷徑

from importlib import importmodule
so = importmodule("so")

和這個:

from so import profit_benchmark

是捷徑

from importlib import importmodule
so = importmodule("so")
profit_benchmark = so.profit_benchmark
del so

正如 juanpa(簡要地)解釋的那樣,在第二種情況下,最終會出現兩個名稱( so.profit_benchmarkyour_importing_module.profit_benchmark ),它們都指向同一個對象。

現在 Python 變量不是 C 風格的內存位置,它們是名稱空間中的 name=>object 條目(主要是字典中的鍵:值對)。 賦值實際上只是使指定的命名指向另一個對象,所以當你這樣做時

from so import profit_benchmark
profit_benchmark = 42

第一條語句在當前命名空間中創建名稱“profit_benchmark”並將其綁定到與so.profit_benchmark指向的對象相同的對象,第二條語句將當前命名空間的profit_benchmark名稱重新profit_benchmark42 int 對象,使so.profit_benchmark完全保持不變. 所有這些(以及更多非常有用的知識)在這篇 Ned Batchelder 的文章中進行了深入的解釋。

另一方面,當你做

import so
so.profit_benchmark = 42

您正在重新綁定的名稱實際上是so的“全局” profit_benchmark - 它實際上已成為so模塊對象的屬性(在運行時,模塊也是對象),因此任何其他讀取so.profit_benchmark模塊現在都將獲得更新后的值.

就是說:你要求“pythonic方式”,而pythonic方式實際上是盡可能地避免可變的全局狀態(這就是為什么python的“全局變量”不是真正的全局變量的原因之一)。 事實是,一旦你養成了盡可能多地使用純函數和類的習慣,當你需要在函數狀態之間有一些共享狀態時,你就會意識到你可以編寫非常大的程序,而無需一個“可寫的”全局(注意:只讀全局變量當然是完全可以的,當你開始變異或者 - 更糟糕的是 - 重新綁定全局變量時,問題就開始了)。

所以問題是:為什么你認為你需要一個可寫的全局變量? 有很多方法可以避免它們,但“正確”的解決方案取決於具體的用例,你什么也沒說。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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