python中在哪些情况下必须使用global来声明全局变量

如题所述

你的问题中已经说了啊!就是当它作为全局变量的时候!

举个例子来说,当你有一个参数在一个方法中会被改变,如果你希望把这个改变给积累下来,而不是每一次都是从头开始变化的话,那么这个参数就需要声明为全局变量

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-19

以下是一个多线程的python代码片段,其中的x,l都是全局变量,但在threadcode()函数中只声明了global x没有global l。完整的代码是可以成功运行,但是把global x注释掉后就会报错。这是为什么,Lock对象比较特殊吗?

[python] view plain copy

    import threading, time, sys  

    x = 50  

    l = threading.Lock()  

    def threadcode():  

    global x  

    l.acquire()  

    print 'Thread %s invoked.' % threading.currentThread().getName()  

    try:  

    print 'Thread %s running.' % threading.currentThread().getName()  

    x = x + 50  

    print 'Thread %s set x to %d.' % \  

    (threading.currentThread().getName(), x)  

    finally:  

    l.release()  

    ......  

    推广一下,就成了在什么情况下必须使用global声明全局变量的问题。这段代码不用在函数中声明global x也可以打印出x的值

    [python] view plain copy

    x = 20  

    def getx():  

    print x  

    getx()  

    在segmentfault上提问,得到了这样的回答

    [plain] view plain copy

    对于Python2而言,对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global。相反,如果你对其赋了值的话,那么你就需要声明global。声明global的话,就表示你是在向一个全局变量赋值,而不是在向一个局部变量赋值。  


    这样一来就清楚了。原因想来应该是这样,如果在函数内对一个全局变量赋值而没有提前声明的话,它会被当成一个与全局变量同名的局部变量,像这样

    [python] view plain copy

    x = 20  

    def getx():  

    x = 50  

    print x  

    getx()#print 50  


    所以如果把第一段代码中的global x注释掉,执行到x = x + 50就报错,因为这里的x既不是全局变量,也没有作为局部变量被初始化。而对于l,因为它是一个对象,调用对象成员函数和访问普通变量的值一样,所以也不需要事先声明其为全局变量,就像下面这样。

    [python] view plain copy

    class A:  

    def __init__(self, x):  

    self.x = x  

    def setx(self, x):  

    self.x = x  

    a = A(50)  

    def func():  

    a.setx(20)  

    print a.x  

    func()#print 20  

本回答被提问者采纳
第2个回答  2019-11-23
当你在一个程序中用了它给它赋值,并且要用赋值后的它,那么就必须要global了。本来它只是local的引用和赋值,不会影响其他程序的使用,但global之后就会影响程序外的值