访问“模块作用域”变量

20 投票
4 回答
25762 浏览
提问于 2025-04-16 22:21

我现在正在学习Python,并且需要做一个Python 2.7的项目。

在模块的函数中访问“模块范围”的变量对我来说有点 confusing,我还没找到一个满意的方法。

到目前为止我的尝试:

方法 1:

my_module.py

my_global_var = None

def my_func():
    global my_global_var
    my_global_var = 'something_else'

在这里,我觉得把局部变量和“模块范围”的变量搞混是很容易的。

方法 2:

my_module.py

import my_module

my_global_var = None

def my_func():
    my_module.my_global_var = 'something_else'

在这里,“my_module”的名字在必要时不能像“方法 1”那样轻易更改。而且,让一个模块自己导入自己听起来也很奇怪。

你有什么建议吗?或者你会推荐其他方法吗?谢谢。

4 个回答

3

在一个模块内部导入它自己可能会带来一些不好的影响,比如可能会让某些语句被执行多次。我建议你使用“方法一”,并且可以用像pylint这样的工具来帮助检查你的代码,确保遵循一些常见的编程规范。

你可以在这里找到PyLint: http://www.logilab.org/project/pylint

4

第一种方法是当你真的必须重新绑定一个全局变量时的正确做法。不过,你应该问问自己,为什么要修改全局变量,是否有更好的办法,比如把相关的行为放到一个类里面。

把一个模块导入到它自己里面是应该避免的,因为这样容易出错。如果这个模块同时也是一个脚本,有时候你需要导入__main__,或者如果这个模块是某个包的一部分,可能你应该导入foo.my_module。总之,尽量不要这样做。

26

你可能想了解一下Python的命名空间。方法1是正确的,但通常没必要,方法2更是不要用。一个更简单的方法是直接使用字典(dict)、类或者其他对象:

my_globals = {'var': None}

def my_func():
    my_globals['var'] = 'something else'

赋值操作总是发生在最内层的作用域中,而且最内层的作用域总是会被优先查找,所以才需要使用global关键字。在这种情况下,你并没有给一个名字赋值,所以其实用不着这个关键字。

撰写回答