你在Python中使用“全局”语句吗?

时间:2008-09-28 19:37:19

标签: python global

我正在阅读有关Python 全局语句("Python scope")的问题,我记得我在Python初学者时使用此语句的频率(我使用全球很多)以及如何,如今,多年以后,我根本不使用它。我甚至认为它有点“非pythonic”。

你在Python中使用这个语句吗?您对它的使用是否随时间而变化?

12 个答案:

答案 0 :(得分:55)

我在这样的上下文中使用'global':

_cached_result = None
def myComputationallyExpensiveFunction():
    global _cached_result
    if _cached_result:
       return _cached_result

    # ... figure out result

    _cached_result = result
    return result

我使用'全局'是因为它有意义,并且对于函数的读者来说很清楚发生了什么。我也知道这种模式是等效的,但会给读者带来更多的认知负担:

def myComputationallyExpensiveFunction():
    if myComputationallyExpensiveFunction.cache:
        return myComputationallyExpensiveFunction.cache

    # ... figure out result

    myComputationallyExpensiveFunction.cache = result
    return result
myComputationallyExpensiveFunction.cache = None

答案 1 :(得分:15)

在我3年多的专业使用Python以及作为Python爱好者超过5年的任何生产代码中,我从来没有合法使用该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种“全局”状态,则它位于某个共享结构中,如全局缓存。

答案 2 :(得分:10)

我在函数创建或设置将在全局使用的变量的情况下使用它。以下是一些例子:

discretes = 0
def use_discretes():
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes"
    global discretes
    if using_real_hardware():
        discretes = 1
...

file1.py:
    def setup():
        global DISP1, DISP2, DISP3
        DISP1 = grab_handle('display_1')
        DISP2 = grab_handle('display_2')
        DISP3 = grab_handle('display_3')
        ...

file2.py:
    import file1

    file1.setup()
    #file1.DISP1 DOES NOT EXIST until after setup() is called.
    file1.DISP1.resolution = 1024, 768

答案 3 :(得分:8)

在我看来,只要您觉得需要在python代码中使用全局变量,就可以暂停一下并重新编写代码。
global置于代码中并延迟重构过程可能听起来很有希望,如果你的死线很接近,但是,相信我,你不会回到这个并修复,除非你真的必须 - 像你的代码因某些奇怪的原因而停止工作,你必须调试它,你会遇到一些global变量,而他们所做的只是弄乱了。

老实说,即使这是允许的,我也会尽量避免使用它。即使它意味着一个简单的类 - 围绕你的代码构建。

答案 4 :(得分:3)

对象是具有非本地状态的首选方式,因此很少需要全局。我不认为即将推出的非局部修饰符也将被广泛使用,我认为它主要是让lispers停止抱怨: - )

答案 5 :(得分:3)

我将它用于命令行脚本和'optparse'的全局选项:

我的main()解析参数并将这些参数传递给脚本工作的任何函数......但是将提供的选项写入全局'opts'字典。

Shell脚本选项通常会调整'leaf'行为,并且通过每个参数列表对'opts'字典进行线程化是不方便的(也是不必要的)。

答案 6 :(得分:2)

我避免使用它,我们甚至在我们的生产代码中禁止使用pylint规则。我实际上相信它根本不存在。

答案 7 :(得分:2)

很少。我还没有找到它的用途。

答案 8 :(得分:2)

它可以在线程中用于共享状态(具有围绕它的锁定机制)。

但是,我很少使用它。

答案 9 :(得分:2)

我在快速和快速使用它脏的,一次性脚本,以自动执行一些一次性任务。任何比这更大的东西,或者需要重复使用的东西,我会找到一种更优雅的方式。

答案 10 :(得分:1)

一次或两次。但重构始终是一个很好的起点。

答案 11 :(得分:0)

如果我可以避免它,不。而且,据我所知,总有一种方法可以避免它。但我并没有说明它完全无用