當一個函數被呼叫的時候,就會建立一個區域性作用域,在這個函數內的所有變數都存在於該區域性作用域內(global的變數除外),該函數返回時,這個區域性作用域被銷燬,這個區域性作用域內的區域性變數隨之丟失
下面根據具體程式碼舉例說明
def spam():
egg = 'this is in function spam'
spam()
print(egg)
在函數spam()
(區域性作用域)中給egg賦值,然後在全域性作用域中呼叫函數spam()
執行後顯示,egg未被定義
egg是區域性變數,而print(egg)
中的變數egg是全域性變數,全域性作用域中的程式碼不能使用區域性作用域中的變數
這一點我理解為:在呼叫子函數spam()
時,建立了一個區域性作用域,並在區域性作用域中定義了一個區域性變數,當子函數呼叫結束後,區域性作用域和內部定義的區域性變數一起沒銷燬,因此在全域性作用域中,找不到egg這個區域性變數
def spam():
print(egg)
egg = 'Outside the function'
spam()
全域性變數在宣告或賦值時被建立,直到程式被終止或執行結束
如果在egg賦值前呼叫函數
def spam():
print(egg)
spam()
egg = 'Outside the function'
這時候會顯示變數未被定義
def spam():
print(egg)
def init():
egg = 'this is in init funcion'
init()
spam()
def spam():
egg = 'this is in spam function'
print(egg)
def init():
egg = 'this is in init funcion'
print(egg)
#egg = 'Out side function'
#print(egg)
init()
spam()
兩個子函數中都定義了變數egg,但在列印時,互不影響
在上面說到,可以在區域性作用域中呼叫全域性變數,並且在給出的例子中,我們的子函數中只有一個print操作,但如果一個變數既在全域性作用域中定義,又在區域性作用域中定義,那麼會出現什麼樣的列印結果
def spam():
egg = 'this is in spam function'
print(egg)
def init():
egg = 'this is in init funcion'
print(egg)
egg = 'Out side function'
print(egg)
init()
spam()
這裡我的理解是:在區域性作用域要對一個變數進行操作,Python會先在當前區域性作用域查詢有沒有宣告這個變數,如果有,就優先使用當前區域性作用域中的變數,如果當前區域性作用域作用域中沒有,才會去全域性作用域中尋找
global允許在區域性作用域中宣告全域性變數
def spam():
global egg
egg = 'In spam function'
spam()
print(egg)
通過使用global語句在區域性作用域中宣告了一個全域性變數egg,當函數spam()
呼叫結束後變數egg並未隨之銷燬
在上面的例子中說過,如果在全域性變數和區域性變數同名,那麼區域性作用域中會優先處理在當前作用域中宣告的的變數
用下面的例子進一步說明這個問題
def spam():
print(egg)
egg = 'In spam function'
egg = 'Out side function'
spam()
報錯顯示區域性變數在賦值前被參照
,就像前面所說,當在區域性作用域中處理一個變數時,Python會先檢視這個變數是否在區域性作用域中進行宣告,然後在會在全域性作用域中查詢這個變數的宣告
《Python程式設計快速上手》