猿问

那请问在哪些情况下必须要使用global声明全局变量?

这段代码不用在函数中声明global x就可以打印出x的值

x = 20def getx():    print xgetx()

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

import threading, time, sysx = 50l = 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()
...


千万里不及你
浏览 165回答 2
2回答

德玛西亚99

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

肥皂起泡泡

Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))的规则进行操作的。看下面的例子>>>&nbsp;x&nbsp;=&nbsp;10>>>&nbsp;def&nbsp;foo():...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;1...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;x...>>>&nbsp;foo()Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module> &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;2,&nbsp;in&nbsp;foo UnboundLocalError:&nbsp;local&nbsp;variable&nbsp;'x'&nbsp;referenced&nbsp;before&nbsp;assignment这是因为,在一个作用域里面给一个变量赋值的时候,Python自动认为这个变量是这个作用域的本地变量,并屏蔽作用域外的同名的变量。很多时候可能在一个函数里添加一个赋值的语句会让你从前本来工作的代码得到一个UnboundLocalError。下面的是文档中的解释:This is because when you make an assignment to a variable in a scope, that variable becomes local to that scope and shadows any similarly named variable in the outer scope.在使用列表(lists)的时候,很容易就触发这种错误。看下面这个例子:>>>&nbsp;lst&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3]>>>&nbsp;def&nbsp;foo1():...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.append(5)&nbsp;&nbsp;&nbsp;#&nbsp;这没有问题......>>>&nbsp;foo1()>>>&nbsp;lst[1,&nbsp;2,&nbsp;3,&nbsp;5]&nbsp; >>>&nbsp;lst&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3]>>>&nbsp;def&nbsp;foo2():...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst&nbsp;+=&nbsp;[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;...&nbsp;这就有问题了!...>>>&nbsp;foo2()Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module> &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;2,&nbsp;in&nbsp;foo UnboundLocalError:&nbsp;local&nbsp;variable&nbsp;'lst'&nbsp;referenced&nbsp;before&nbsp;assignment
随时随地看视频慕课网APP

相关分类

Python
我要回答