Python 全域性變數、區域性變數、靜態變數 詳解
阿新 • • 發佈:2019-02-10
全域性變數
全域性變數供全域性共享,全域性類和函式均可訪問,達到同步作用。同時還可以被外部檔案訪問。
它的一個特徵是除非刪除掉,否則它們會存活到指令碼執行結束,且對於所有的函式,它們的值都是可以被訪問的。
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。