python中在哪些情况下必须使用global来声明全局变量?
PHPz
PHPz 2017-04-17 11:26:41
0
2
514

这段代码不用在函数中声明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()
...
PHPz
PHPz

学习是最好的投资!

全部回覆(2)
黄舟

對於Python2而言,對於一個全域變量,你的函數裡如果只使用到了它的值,而沒有對其賦值(指a = XXX這種寫法)的話,就不需要聲明global。相反,如果你對其賦了值的話,那麼你就需要聲明global。宣告global的話,就表示你是在對一個全域變數賦值,而不是在一個局部變數賦值。

大家讲道理

Python的作用域解析是基於稱為LEGB(Local(本地),Enclosing(封閉),Global(全域),Built-in(內建))的規則進行操作的。看下面的範例

>>> x = 10
>>> def foo():
...     x += 1
...     print x
...
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before 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)的時候,很容易就觸發這種錯誤。看下面這個範例:

>>> lst = [1, 2, 3]
>>> def foo1():
...     lst.append(5)   # 这没有问题...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]
 
>>> lst = [1, 2, 3]
>>> def foo2():
...     lst += [5]      # ... 这就有问题了!
...
>>> foo2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'lst' referenced before assignment
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板