Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您是否使用;“全球”;Python中的语句?_Python_Global - Fatal编程技术网

您是否使用;“全球”;Python中的语句?

您是否使用;“全球”;Python中的语句?,python,global,Python,Global,我在读一个关于Python全局语句()的问题,我记得在我还是Python初学者的时候(我经常使用全局语句),我是如何经常使用这个语句的,以及在几年后的今天,我是如何完全不使用它的。我甚至认为它有点“非蟒”。 在Python中是否使用此语句?您对它的使用是否随着时间的推移而改变?在我3年多专业使用Python的时间里,以及作为Python爱好者的5年多时间里,我从未在任何生产代码中合法使用过该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种“全局”状态,则它位于某种共享结构中,如全局缓存

我在读一个关于Python全局语句()的问题,我记得在我还是Python初学者的时候(我经常使用全局语句),我是如何经常使用这个语句的,以及在几年后的今天,我是如何完全不使用它的。我甚至认为它有点“非蟒”。
在Python中是否使用此语句?您对它的使用是否随着时间的推移而改变?

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

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

如果我能避免的话,不。而且,据我所知,总是有办法避免的。但我并不是说它完全没有用,对象是非局部状态的首选方式,所以很少需要全局。我认为即将到来的非局部修饰符也不会被广泛使用,我认为它主要是为了让lispers停止抱怨:-)

在我看来,一旦您觉得需要在python代码中使用全局变量,就应该停下来,重新编译代码。
如果你的死线很近,那么在代码中加入
global
并延迟重构过程可能听起来很有希望,但是,相信我,除非你真的必须这样做,否则你不会回到这一点并进行修复-就像你的代码因为某种奇怪的原因停止工作一样,你必须对它进行调试,你会遇到一些
全局
变量,它们只会把事情搞砸


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

我避免使用它,我们甚至有一条规则禁止在生产代码中使用它。实际上,我认为它根本不应该存在。

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

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

    # ... figure out result

    _cached_result = result
    return result
我使用“global”是因为它有意义,并且对函数的读者来说是清楚的。我也知道有这样一种模式,它是等效的,但会给读者带来更多的认知负担:

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

    # ... figure out result

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

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

它在共享状态的线程中很有用(周围有锁定机制)


然而,我很少使用它。

我曾在快速、肮脏、一次性的脚本中使用它来自动化一些一次性任务。任何比这更大的东西,或者需要重用的东西,我会找到一种更优雅的方法。

我将其用于命令行脚本和“optpasse”的全局选项:

my main()解析参数并将其传递给执行脚本工作的任何函数。。。但将提供的选项写入全局“opts”字典


Shell脚本选项通常会调整“leaf”行为,在每个参数列表中穿行“opts”字典很不方便(也没有必要)

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

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
...


我倾向于在这样的情况下使用decorator模块的“memoize”函数,但我不能指责您的全局用法的清晰性:)我不知道定义函数的属性(例如myComputizallyExpensiveFunction.cache)并在函数体中使用它的可能性,谢谢!我从来没有听说过为函数指定属性,这是很棒的东西!谢谢第二个示例的第二行应该是“if getattr(myComputationallyExpensiveFunction,“cache”,None):”,否则AttributeError.@AndyGrover我不需要这样做,没有它代码工作正常,我看不到任何AttributeError(?)
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