1. 程式人生 > >python 學習筆記-變數作用域

python 學習筆記-變數作用域

全域性變數:在模組內、在所有函式外面、在class外面,這就是全域性變數
區域性變數:在函式內、在class的方法內(未加self修飾),這就是區域性變數
靜態變數:在class內的,但不在class的方法內的,這就是靜態變數
例項變數:在class的方法內的,用self修飾的變數,這就是例項變數

全域性變數

全域性變數供全域性共享,全域性類和函式均可訪問,達到同步作用。同時還可以被外部檔案訪問。全域性變數使用的時候,需要用global顯示宣告。
如果函式直接呼叫全域性變數,不做更新,一般沒有問題,但如果有重新賦值,又沒有在函式內部使用 global宣告的話, 就相當於在內部建立了一個同名的區域性變數,區域性變數優先順序要高於全域性變數。

# coding:utf-8
_all = 'HelloWorld'    # 全域性變數
_all_list = []    # 全域性變數

def printall():
    global _all    # 這裡需要用global顯示宣告
    print _all    # HelloWorld

錯誤:

# coding:utf-8
_all = 0    # 全域性變數
_all_list = []    # 全域性變數

def printall():
    # 這裡不使用global顯示宣告
    # 更新一下_all,這裡其實是printall的區域性變量了
    _all = 3
print _all printall() # 結果3 print _all # 結果為0

區域性變數

生命期間函式內

# coding:utf-8
def show():
    city = 'Beijing'    # 區域性變數
    print city

靜態變數

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

# coding:utf-8
class foo:
    all = 0   
    def add(self):
        foo.q += 1

instance01 = foo()   # 例項化物件1
instance02= foo() # 例項化物件2 print instance01.all # 執行結果為:0 print instance02.all # 執行結果為:0 print foo.all # 執行結果為:0 instance01.add() print instance01.all # 執行結果為:1 print instance02.all # 執行結果為:1 print foo.all # 執行結果為:1 instance02.add() print instance01.all # 執行結果為:2 print instance02.all # 執行結果為:2 print foo.all # 執行結果為:2

例項變數

對於模組來說,有了自己的全域性變數,可以供自己內部的類,函式使用,同步;對於函式或者類方法來說,有了自己的區域性變數,供自己內部使用;對於類,有了靜態變數,可以供內部和有繼承關係的父子之際使用,同步;但例項之間各自的私有變數(區域性變數)就要靠例項變量了,實現了動態繫結,多型特性。
用self來修飾

# coding:utf-8
class foo:
    all = 0
    def __init__(self, name):
        self.name = name
    def add(self):
        foo.q += 1

instance01 = foo('hello')
instance02 = foo('hi')
print instance01.name    # hello
print instance02.name    # hi
print foo.name     # AttributeError:class foo has no attribute 'name'

總結

在整個程式碼組織的過程中,一般會有這樣兩種基本需求,私有和公有。

私有

不與其他共享,自己獨享,如函式和方法的區域性變數,例項變數

公有

需要在一定範圍內共享,達到同步目的,如模組內的程式碼共享的全域性變數,類與子類之間共享的靜態變數