访问“模块作用域”变量
我现在正在学习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关键字。在这种情况下,你并没有给一个名字赋值,所以其实用不着这个关键字。