1. 程式人生 > >Python中的變數作用域與名稱空間(LEGB)

Python中的變數作用域與名稱空間(LEGB)

Python 使⽤LEGB的順序來查詢⼀個符號對應的物件

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會⾸先載入該內建模組到記憶體。        

另外,該內建模組中的功能可以直接使⽤,不⽤在其前新增內建模組字首,其原因是對函式、變數、類等識別符號的查詢是按LEGB法則,其中B即代表內建模組⽐如:內建模組中有⼀個abs()函式,其功能求絕對值,如abs(-20)將返回20。