在Python函数中引用(而不是分配)全局变量。不好的做法与否?

时间:2015-01-21 16:40:22

标签: python global-variables

有很多关于必须在Python中声明全局变量的帖子,以及相关的Python范围规则。然而,无论是在互联网上还是在我咨询过的教科书中,我都无法找到对上述更具体问题的满意对待。

即使是初学程序员,我也很欣赏 为函数中的全局名称分配 可能带来的困难,以及为什么大多数程序员都建议使用全局语句因此要谨慎使用。

但是,我的许多早期程序包含许多函数,这些函数本身包含许多 引用 (即不要求全局声明)到全局变量。在我看来,因为这些只是引用(即不改变变量),所以在分配全局变量的情况下出现困难的可能性不同。

如果有经验的程序员可以指导我在函数中使用全局引用(而不是赋值)的最佳实践,我将不胜感激。我应该更改这些函数参数的全局引用吗? 非常感谢。

3 个答案:

答案 0 :(得分:1)

如果您尝试在函数内部使用全局变量,则解释器将尝试在最近的范围内查找它,然后在其他可能的范围内查找。如果你的代码足够复杂,它会循环遍历很多范围和许多不同的变量,试图找到你想要的那个。如果您的脚本只包含一些不经常使用全局变量的函数,那么它就可以了。

总而言之,代码越复杂,搜索变量所花费的时间就越多。

答案 1 :(得分:1)

如果您只需要对全局状态的引用,请考虑将其作为参数传递给函数,而不是依赖于向上遍历范围,直到您点击定义全局值的那个。

假设全局状态确实只是引用并且从不变异,那么没有理由不在函数需要时将其作为参数传递。 (如果全局值本身就是一个大型数据结构,那么无论如何都应该通过引用传递它。)

通常,这仍会导致设计混乱,因为您将开始将状态参数作为参数传递到整个地方。例如,如果函数调用其他函数并且内部函数需要全局状态,那么外部函数也是如此。 "求解"通过使内部函数在范围内向上移动并不能真正减少任何依赖性,因为外部函数仍然需要嵌套在最终导致查找全局变量的范围内。那么为什么不至少对未来的代码阅读器有所帮助,并通过在函数的参数列表中命名变量来使用变量呢?

答案 2 :(得分:0)

首先,模块级全局常量没有什么问题,只要它们实际上不变。如果math模块没有提供pi,我不会因为你在模块的顶部定义它而不是将它作为参数传递给任何需要它的函数。 style guide建议您在这些情况下将变量名称大写。这是一个不应该分配这些变量的信号。

另一方面,我很少在代码中使用这些常量。正如@ prpl.mnky.dshwshr建议的那样,支持将变量作为参数传递给使用它们的函数。如果你继续传递相同的参数组合,例如:

def f1(foo, bar, baz, x):
    ...

def f2(foo, bar, baz, y):
    ...

def f3(foo, bar, baz, z):
    ...

可能建议f1f2f3应该在封装foo,{{1}值的类中}和bar

baz