我目前正在使用Python開發一個遊戲項目,並且我發現自己正在與Python背後的「概念」掙扎,因爲我習慣於C或Java等語言。Python中所有模塊的全局變量
我試圖用不同的主題在幾個文件中「劃分」我的項目(即所謂的模塊,如果我沒有弄錯,雖然它們全都在與C源文件相同的文件夾中):objects.py
,map.py
,rendering.py
等。它們包含與這些概念相關的不同類別和功能。我有一個main.py
,其中包含我所有的「主要」功能(如new_game
等)以及第一個「呼叫」,它將呼叫main_menu
。
我也有一個constants.py
文件,我存儲常量值。現在的事情是,我在我的遊戲中有幾個「全局」變量和對象:玩家對象,地圖等等。我希望在所有模塊中保持這些變量的全局性,並能夠從任何地方訪問和修改它們。
我首先創建了一個global_variables.py
文件,其中列出了所有我的變量(如map = None
,player = None
等),期望通過其他模塊修改它們。
問題是,每當我再次調用導入global_variables
時,它會遍歷整個代碼並將其全部重新初始化爲None
,這顯然不是我想要的。
我在另一個stackoverflow線程上讀到一個提示:在我的文件中創建一個init()
函數,我將初始化所有變量並將它們聲明爲全局變量。這樣,我只需撥打global_variables.init()
一次,然後我就可以簡單地通過global_variables.player
訪問播放器並對其進行修改。
它運作良好,但我覺得它雜亂無章。我有大量的global foo
,其次是foo = None
,感覺就像不必要的代碼行。此外,當我輸入global_variables時,IDE不能「訪問」變量。 ,它不會將變量建議爲自動完成,這是一個非常痛苦的事情。
那麼還有另外一種方法嗎?這個想法是將任何函數中的變量「聲明」出來,以便IDE瞭解它們在那裏,但只需「初始化」它們一次,這樣每次我導入global_variables
模塊時都可以避免它們被重置。
然後我不明白。我將global_variables作爲gv導入,並有一個函數,例如,用double for循環(如模擬2維數組)初始化gv.map。然後我會調用另一個函數,從另一個模塊在另一個模塊中執行,然後它會顯示map = None。所以沒有改變地圖。我發現init()解決方案是對其他人遇到的問題的回答。 – lap0573 2014-10-07 13:28:18
@ lap0573:你需要使用'import global_variables',* not *'from global_variables import map';如果'global_variables.map'被更改,後者仍然會被綁定到前一個值。 – 2014-10-07 13:31:46
@ lap0573:在Python中,列表,元組,集合和字典等中的所有名稱(屬性,本地,全局變量)和項目都是*引用*。如果重新綁定這樣一個名稱,那麼引用舊對象的其他名稱將不會反彈到新對象。通過使用'modulename.name',您始終引用一個屬性(該模塊中的全局名稱),並始終查看綁定的內容。 – 2014-10-07 13:34:36