LEGB

理解LEGB前冻河,首先需要對Python的作用域莉擒、命名空間有一定的了解钝计,話題才能繼續(xù)展開恋博。


命名空間


命名空間表示變量的可見范圍,一個變量名可以定義在多個不同的命名空間私恬,相互之間并不沖突债沮,但同一個命名空間中不能有兩個相同的變量名。比如:兩個叫“張三”的學(xué)生可以同時存在于班級A和班級B中本鸣,如果兩個張三都是一個班級疫衩,那么帶來的麻煩復(fù)雜很多了,在Python中你不能這么干荣德。


在Python中用字典來表示一個命名空間闷煤,命名空間中保存了變量(名字)和對象的映射關(guān)系,在Python中命名空間出現(xiàn)在哪些地方呢命爬?有函數(shù)范圍內(nèi)的命名空間(local)曹傀,有模塊范圍內(nèi)的命名空間(global),有python內(nèi)建的命名空間(built-in)饲宛,還有類對象的所有屬性組成的命名空間皆愉。


命名空間的生命周期


所有的命名空間都是有生命周期的,對于python內(nèi)建的命名空間艇抠,python解析器啟動時創(chuàng)建幕庐,一直保留直至直python解析器退出時才消亡。而對于函數(shù)的local命名空間是在函數(shù)每次被調(diào)用的時候創(chuàng)建家淤,調(diào)用完成函數(shù)返回時消亡异剥,而對于模塊的global命名空間是在該模塊被import的時候創(chuàng)建,解析器退出時消亡絮重。


作用域


一個作用域是指一段程序的正文區(qū)域冤寿,可以是一個函數(shù)或一段代碼。一個變量的作用域是指該變量的有效范圍青伤。Python的作用域是靜態(tài)作用域督怜,因為它是由代碼中得位置決定的,而命名空間就是作用域的動態(tài)表現(xiàn)狠角。


LGB


Python2.2之前定義了三個作用域号杠,分別是:


global作用域,對應(yīng)的global命名空間,一個模塊最外層定義的一個作用域姨蟋。

local作用域屉凯,對應(yīng)local命名空間,由函數(shù)定義的眼溶。

builtin作用域悠砚,對應(yīng)builtin命名空間,python內(nèi)部定義的最頂層的作用域偷仿,在這個作用域里面定義了各種內(nèi)建函數(shù):open哩簿、range、xrange酝静、list等等节榜。

那時的Python作用域規(guī)則叫做LEB規(guī)則,變量(名字)的引用按照local作用域别智、global作用域宗苍、builtin作用域的順序來查找。


首先來看一段代碼:


a = 1


def foo():

? ? a = 2

? ? print a? //[1]


print a? ? ? //[2]


foo()

[1]處輸出結(jié)果為2薄榛,Python首先會在函數(shù)foo定義的local作用域中查找名字a讳窟,如果找到了直接輸出,沒有沒找到就會在模塊定義的global作用域中查找敞恋,如果還沒找到丽啡,就到Python內(nèi)建的builtin作用域中查找a,如果還沒找到就報異常:NameError: name 'a' is not defined硬猫。引用過程如圖:

lgb


[2]處輸出結(jié)果為1补箍,查找順序同樣是按照LGB規(guī)則,只不過這里的local作用域就是global作用域啸蜜。


LEGB規(guī)則


Python2.2開始引入嵌套函數(shù)坑雅,嵌套函數(shù)為python提供了閉包實現(xiàn)。


a = 1

def foo():

? a = 2

? def bar():

? ? ? ? print a? //[1]

? ? return bar


func = foo()

func()

函數(shù)bar和a=2捆包在一起組成一個閉包衬横,因此這里a=2即使脫離了foo所在的local作用域裹粤,但調(diào)用func的時候(其實就是調(diào)用bar)查找名字a的順序是LEGB規(guī)則,這里的E就是enclosing的縮寫蜂林,代表的“直接外圍作用域”這個概念遥诉。查找a時,在bar對應(yīng)的local作用域中沒有時噪叙,然后在它外圍的作用域中查找a突那。LEGB規(guī)定了查找一個名稱的順序為:local-->enclosing-->global-->builtin。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构眯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子早龟,更是在濱河造成了極大的恐慌惫霸,老刑警劉巖猫缭,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壹店,居然都是意外死亡猜丹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門硅卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來射窒,“玉大人,你說我怎么就攤上這事将塑÷龆伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵点寥,是天一觀的道長艾疟。 經(jīng)常有香客問我,道長敢辩,這世上最難降的妖魔是什么蔽莱? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮戚长,結(jié)果婚禮上盗冷,老公的妹妹穿的比我還像新娘。我一直安慰自己同廉,他們只是感情好仪糖,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恤溶,像睡著了一般乓诽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咒程,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天鸠天,我揣著相機與錄音,去河邊找鬼帐姻。 笑死稠集,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饥瓷。 我是一名探鬼主播剥纷,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呢铆!你這毒婦竟也來了晦鞋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悠垛,沒想到半個月后线定,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡确买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年斤讥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湾趾。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡芭商,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搀缠,到底是詐尸還是另有隱情铛楣,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布胡嘿,位于F島的核電站蛉艾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衷敌。R本人自食惡果不足惜勿侯,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缴罗。 院中可真熱鬧助琐,春花似錦、人聲如沸面氓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌界。三九已至掘譬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呻拌,已是汗流浹背葱轩。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留藐握,地道東北人靴拱。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像猾普,于是被迫代替她去往敵國和親袜炕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本篇總結(jié)了Python中的命名空間及LEGB原則 寫在前面的話之所以有這篇總結(jié)初家,是因為在當(dāng)初學(xué)習(xí)及使用Python...
    _Zhao_閱讀 15,397評論 4 29
  • LEGB是Python中變量查找的重要概念偎窘。本文通過概念和試題的形式乌助,視圖形象的解釋LEGB在Python中的應(yīng)用...
    everfight閱讀 392評論 0 1
  • 〇、前言 本文共108張圖评架,流量黨請慎重眷茁! 歷時1個半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細梳理了一遍纵诞。 ...
    Raxxie閱讀 18,928評論 17 410
  • Python進階 - 命名空間與作用域 寫在前面 如非特別說明,下文均基于Python3 命名空間與作用于跟名字的...
    理查德成閱讀 1,236評論 3 8
  • 文/晴天過后上一章 目錄 聲聲戰(zhàn)鼓擂響培遵,玄狼一族亮出兵器浙芙,“殺!”喊殺之音一過籽腕,兇神惡煞的妖獸開始撞擊...
    晴天過后閱讀 479評論 8 14