我有一個 JSON 文件,我在一個小游戲中將其用作數據存儲,我將其用作學習 Python 的一種方式。我精通許多其他語言。我有幾個類想要對 JSON 進行讀取訪問,所以我想將文件中的 JSON 加載到一個變量中,然后允許其他類通過 getter 和 setter 訪問該變量,因為每個類都需要 JSON 的不同部分。這聽起來像是單身人士的工作。我知道 Python 模塊的行為就像一個單例。但是,當我將模塊導入我的類時,變量會重置嗎?這是一個非常精簡的例子:模塊:- state_managerx=45def set_x(value): x=valuedef get_x(): return x類:- 游戲import Playerimport state_managervalue = state_manager.get_x()班級:- 球員import state_managerstate_manager.set_x(12)通過設置斷點,我可以看到當 Player 被 Game 導入時將inPlayer的值設置為 12。xstate_manager但是當我查看x返回到 Game的值時,state_manager.get_x()我得到了 45。為什么是這樣?在 Python 中創建可以在其他類之間共享的模塊或對象的正確方法是什么?我意識到我可以自己構造一個 Singleton,但我想我會使用 Python 的特性。
2 回答

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
通過設置斷點,我可以看到當 Player 被 Game 導入時,Player 將 state_manager 中的 x 值設置為 12。
我相當確定你在檢查中做錯了什么,因為這個set_x功能,至少在你引用它的時候......
x=45
def set_x(value):
x=value
...不做你認為它做的事。由于x在 的范圍內被賦值set_x,它不是指全局(模塊級)變量,而是指返回時作為堆棧幀的一部分立即丟棄x的局部變量。靜態賦值的存在實際上是局部變量在 Python 中的聲明方式。解決方法是聲明為引用全局變量:xset_xx
x=45
def set_x(value):
global x
x=value

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
您需要x
在任何試圖全局設置它的函數中聲明全局:
def set_x(value): global x x=value
沒有全局聲明,x
只是一個函數局部變量。
通常,如果一個函數在函數中的任何地方賦值給一個變量,那么該變量就是局部變量,除非它被顯式聲明global
(或nonlocal
)。如果一個函數只讀取一個變量,而不設置它,那么這個變量是從一個更高的范圍(例如,一個全局的,或一個上層引用)中獲取的。
添加回答
舉報
0/150
提交
取消