1. 程式人生 > >Python 全域性變數、區域性變數、靜態變數 詳解

Python 全域性變數、區域性變數、靜態變數 詳解

全域性變數

全域性變數供全域性共享,全域性類和函式均可訪問,達到同步作用。同時還可以被外部檔案訪問。

這裡寫圖片描述

它的一個特徵是除非刪除掉,否則它們會存活到指令碼執行結束,且對於所有的函式,它們的值都是可以被訪問的。

X= 100

def foo():
    global X
    print 'foo() x = ', X
    X = X + 5
    print 'Changed in foo(), x = ', X

def fun():
    global X
    print 'fun() x = ', X
    X = X + 1
    print 'Changed in fun(), x = '
, X if __name__ == '__main__': foo() fun() print 'Result x = ', X

輸出的結果如下:

foo() x = 100
Changed in foo(), x = 105
fun() x = 105
Changed in fun(), x = 106
Result x = 106

區域性變數

區域性變數,就像它們存放的棧,暫時地存在,僅僅只依賴於定義它們的函式現階段是否處於活動。當一個函式調用出現時,其區域性變數就進入宣告它們的作用域。在那一刻,一個新的區域性變數名為那個物件建立了,一旦函式完成,框架被釋放,變數將會離開作用域。

def foo(x):
    print 'x = ', x
    x = 200
    print 'Changed in foo(), x = ', x

x = 100
foo(x)
print 'x = ', x

輸出結果如下:

x = 100
Changed in foo(), x = 200
x = 100

當使用全域性變數同名的區域性變數時要小心,如果將全域性變數的名字宣告在一個函式體內,全域性變數的名字能被區域性變數給覆蓋掉。所以,你應該儘量新增global語句,否則會使得程式的讀者不清楚這個變數在哪裡定義的。

應該儘量避免使用Python全域性變數。不同的模組都可以自由的訪問全域性變數,可能會導致全域性變數的不可預知性。對全域性變數,如果某個**程式設計師修改了值,這時可能導致程式中的錯誤,這種錯誤是很難發現和更正。

全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域性變數。同樣,全域性變數降低了程式碼的可讀性,閱讀者可能並不知道呼叫的某個變數是全域性變數。 但是某些時候,Python全域性變數能夠解決區域性變數所難以解決的問題。

靜態變數(類變數)

靜態變數通過類名可以直接訪問,也可以通過例項名直接訪問,此變數在類中全域性共享,例項之間也是全域性共享。

這裡寫圖片描述

同樣,當執行ins_2.add()的時候,訪問無論從ins_1,ins_2,還是foo訪問all這個變數,該值都變成2。