【问题标题】:Global variables in Python across all modulesPython中所有模块的全局变量
【发布时间】:2014-12-01 22:30:42
【问题描述】:

我目前正在使用 Python 开发一个游戏项目,我发现自己在为 Python 背后的“概念”而苦苦挣扎,因为我已经习惯了 C 或 Java 等语言。

我试图将我的项目“划分”为几个不同主题的文件(如果我没记错的话,这些文件称为模块,尽管它们都在同一个文件夹中,就像我对 C 源文件所做的那样):@987654321 @、map.pyrendering.py 等。它们包含与这些概念相关的不同类和函数。我有一个main.py,其中包含我所有的“主要”功能(例如new_game 等)以及第一个“调用”,它将调用main_menu

我还有一个constants.py 文件,用于存储常量值。现在的问题是,我的游戏中有几个“全局”变量和对象:玩家对象、地图等等。我希望在所有模块中保持这些变量的全局性,并能够从任何地方访问和修改它们。

我首先创建了一个global_variables.py 文件,其中列出了我的所有变量(例如map = Noneplayer = None 等),并希望通过其他模块对其进行修改。

问题是,每次我再次调用 import global_variables 时,它都会遍历整个代码并将它们全部重新初始化为 None,这显然是我不想要的。

我在另一个 stackoverflow 线程上阅读了一个提示:在我的文件中创建一个 init() 函数,我将在其中初始化所有变量并将它们声明为全局变量。这样,我调用global_variables.init()一次,然后我可以简单地调用global_variables.player来访问播放器并对其进行修改。

它运作良好,但我发现它很混乱。我有大量的global foo,然后是foo = None,感觉就像是不必要的代码行。此外,当我键入 global_variables 时,IDE 无法“访问”变量。 ,它并没有将变量提示为自动完成,这很痛苦。

那么还有其他方法吗?这个想法是从任何函数中“声明”变量,以便 IDE 了解它们的存在,但只“初始化”它们一次,这样我就可以避免每次导入 global_variables 模块时它们被重置。

【问题讨论】:

    标签: python module global-variables python-module


    【解决方案1】:

    问题是,每次我再次调用 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重新绑定到不同的值,它将看不到任何新值。

    【讨论】:

    • 那我不明白。我将 global_variables 导入为 gv 并有一个函数,例如,使用双 for 循环初始化 gv.map (因为它模拟了一个二维数组)。然后我会从那里调用另一个函数,它位于另一个模块中以作用于地图,它会告诉我 map = None。所以地图没有变化。我找到了 init() 解决方案来解决其他人遇到的问题。
    • @lap0573: 你需要使用import global_variables不是 from global_variables import map;如果 global_variables.map 被更改,后者仍将绑定到以前的值。
    • @lap0573:在 Python 中,列表、元组、集合和字典等中的所有名称(属性、局部变量、全局变量)和项目都是引用。如果您重新绑定这样的名称,则引用旧对象的其他名称将不会重新绑定到新对象。通过使用modulename.name,您始终引用一个属性(该模块中的全局名称)并始终查看绑定到的内容。
    • 确实如此!这就是我当时正在做的事情,因此是这个问题。我只是迅速尝试从 init() 中取出所有内容并按照您所说的进行导入,并且一切正常。非常感谢:)
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2016-12-11
    • 2016-02-10
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多