2014-10-07 100 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