2014-10-07 104 views
0

我目前正在使用Python開發一個遊戲項目,並且我發現自己正在與Python背後的「概念」掙扎,因爲我習慣於C或Java等語言。Python中所有模塊的全局變量

我試圖用不同的主題在幾個文件中「劃分」我的項目(即所謂的模塊,如果我沒有弄錯,雖然它們全都在與C源文件相同的文件夾中):objects.pymap.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模塊時都可以避免它們被重置。

回答

3

問題是,每當我再次調用import global_variables時,它會遍歷整個代碼並將其全部重新初始化爲None,這顯然不是我想要的。

不,當您多次導入該模塊時,Python不會重新運行代碼。一個模塊被執行一次,生成一個模塊對象,然後被重新用於後續導入。

因此,對所有程序全局變量使用模塊是很好的。只要確保你導入模塊,並分配回該模塊對象的屬性:

import global_variables 

global_variables.name = 'Inigo Montoya' 

;進口global_variables任何其他模塊將看到global_variables.name如設置爲'Inigo Montoya'。不需要init()功能。

使用from global_variables import name,因爲它創建你的模塊中的一個新的名稱name,不會看到任何新的價值,如果其他代碼重新綁定global_variables.name爲不同的值。

+0

然後我不明白。我將global_variables作爲gv導入,並有一個函數,例如,用double for循環(如模擬2維數組)初始化gv.map。然後我會調用另一個函數,從另一個模塊在另一個模塊中執行,然後它會顯示map = None。所以沒有改變地圖。我發現init()解決方案是對其他人遇到的問題的回答。 – lap0573 2014-10-07 13:28:18

+1

@ lap0573:你需要使用'import global_variables',* not *'from global_variables import map';如果'global_variables.map'被更改,後者仍然會被綁定到前一個值。 – 2014-10-07 13:31:46

+1

@ lap0573:在Python中,列表,元組,集合和字典等中的所有名稱(屬性,本地,全局變量)和項目都是*引用*。如果重新綁定這樣一個名稱,那麼引用舊對象的其他名稱將不會反彈到新對象。通過使用'modulename.name',您始終引用一個屬性(該模塊中的全局名稱),並始終查看綁定的內容。 – 2014-10-07 13:34:36