这段代码不用在函数中声明global x
就可以打印出x的值
x = 20
def getx():
print x
getx()
那请问在哪些情况下必须要使用global
声明全局变量?
以下是一个多线程的python代码片段,其中的x,l
都是全局变量,但在threadcode()
函数中只声明了global x
没有global l
。完整的代码是可以成功运行,但是把global x
注释掉后就会报错。请问这是为什么,Lock对象比较特殊吗?
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()
...
對於Python2而言,對於一個全域變量,你的函數裡如果只使用到了它的值,而沒有對其賦值(指
a = XXX
這種寫法)的話,就不需要聲明global。相反,如果你對其賦了值的話,那麼你就需要聲明global
。宣告global
的話,就表示你是在對一個全域變數賦值,而不是在一個局部變數賦值。Python的作用域解析是基於稱為LEGB(Local(本地),Enclosing(封閉),Global(全域),Built-in(內建))的規則進行操作的。看下面的範例
這是因為,在一個作用域裡面給一個變數賦值的時候,Python自動認為這個變數是這個作用域的本地變量,並且屏蔽作用域外的同名的變數。 很多時候可能在一個函數裡加上一個賦值的語句會讓你從前本來工作的程式碼得到一個
UnboundLocalError
。下面的是文件中的解釋: