python 學習筆記-變數作用域
阿新 • • 發佈:2019-01-03
全域性變數:在模組內、在所有函式外面、在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'
總結
在整個程式碼組織的過程中,一般會有這樣兩種基本需求,私有和公有。
私有
不與其他共享,自己獨享,如函式和方法的區域性變數,例項變數
公有
需要在一定範圍內共享,達到同步目的,如模組內的程式碼共享的全域性變數,類與子類之間共享的靜態變數