我目前正在使用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