我目前正在学习Python,我必须从事Python 2.7项目。
在模块本身的功能中访问“模块范围”变量对我来说有点混乱,我找不到令人满意的方法。
到目前为止我的尝试:
方式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”那样轻易更改。另外,将模块导入自身听起来很奇怪。
你会推荐什么?或者你会推荐别的吗?感谢。
答案 0 :(得分:24)
您可能希望阅读Python's namespaces。方式1是正确的但通常是不必要的,从不使用2.更简单的方法是使用dict(或类或其他对象):
my_globals = {'var': None}
def my_func():
my_globals['var'] = 'something else'
分配始终进入最内层范围,始终首先搜索最内层范围,因此需要global关键字。在这种情况下,您没有分配名称,因此没有必要。
答案 1 :(得分:4)
当你必须重新绑定全局变量时,方法1是正确的方法。但是你应该问问自己为什么要修改全局,以及是否有更好的东西可以做(例如将行为封装在类中)。
应避免将模块导入自身,因为它容易出错。如果模块也是脚本,您有时需要导入__main__
,或者如果模块是包的一部分,则可能应该导入foo.my_module
。简而言之,不要这样做。
答案 2 :(得分:3)
在自身内部导入模块会产生不必要的副作用(比如多次评估语句。)我建议使用“Way 1”和像pylint这样的工具来帮助验证代码并执行常规做法。
找到PyLint答案 3 :(得分:1)
完全避免设置全局变量。您可以非常轻松地创建包含类的新命名空间,因此如果必须,请使用类变量。
对于任何严肃的事情,无论如何都需要适当的设计。