Python中的變數作用域與名稱空間(LEGB)
阿新 • • 發佈:2019-01-08
Python 使⽤LEGB的順序來查詢⼀個符號對應的物件
locals -> enclosing function -> globals -> builtins
區域性變數———閉包空間———全域性變數———內建模組
另外,該內建模組中的功能可以直接使⽤,不⽤在其前新增內建模組字首,其原因是對函式、變數、類等識別符號的查詢是按LEGB法則,其中B即代表內建模組⽐如:內建模組中有⼀個abs()函式,其功能求絕對值,如abs(-20)將返回20。
locals -> enclosing function -> globals -> builtins
區域性變數———閉包空間———全域性變數———內建模組
a = 1 # 全域性變數 globals def fun(): a = 2 # 閉包變數 enclosing def inner_fun(): a = 3 # 區域性變數 locals print("a=%d" % a) # 內建模組 builtins return inner_fun f = fun() f()
- locals,當前所在名稱空間(如函式、模組),函式的引數也屬於名稱空間內的變數 enclosing,外部巢狀函式的名稱空間(閉包中常見)
- enclosing, 介於local和global之間的名稱空間
- global, 全域性變數的空間
- builtins,內建模組的名稱空間。
Python 在啟動的時候會自動為我們載⼊很多內建的函式、類,⽐如 dict,list,type,print,這些都位於 __builtin__ 模組中可以使⽤ dir(__builtin__) 來檢視。
這也是為什麼我們在沒有 import任何模組的情況下,就能使⽤豐富的函式和功能了。在Python中,有⼀個內建模組,在該模組中有⼀些常⽤函式;在Python啟動後,且沒有執⾏程式設計師所寫的任何程式碼前,Python會⾸先載入該內建模組到記憶體。