Python | LEGB規(guī)則

LEGB的名字取自:

  • Locals :當(dāng)前命名空間歼捏,如函數(shù)或模塊
  • Enclosing :外部嵌套函數(shù)的命名空間(閉包常見)
  • Globals:全局變量的命名空間
  • Builtins : 內(nèi)建模塊的命名空間

各作用域首字母

LEGB規(guī)則是:Python 使用 LEGB 的順序來查找一個(gè)符號對應(yīng)的對象
順序是:
locals -> enclosing function -> globals -> builtins
查找順序從左到右,不會反過來员凝,比如一個(gè)功能在globals迈嘹,當(dāng)它在當(dāng)前作用域找不到定義時(shí)蚕礼,只能從builtins查找叶圃,而不會從enclosing中去查找

下面以一道題來演示

def proc1():
    j, k = 3, 4
    print('j == %d and k == %d' % (j, k))
    k = 5

def proc2():
    j = 6
    proc1()
    print('j == %d and k == %d' % (j, k))
    
k = 7

proc1()  #1

#print('j == %d and k == %d' % (j, k))  #2

j = 8

proc2()  # 3

print('j == %d and k == %d' % (j, k))  # 4

從代碼中那個(gè)我們可以看出宴抚,一共有 #1和#3兩個(gè)函數(shù)調(diào)用勒魔,#2和#4兩個(gè)print語句(下面會說#2為何要注釋掉)
在看以下分析前,你可以自己先想下答案是什么

  • #1

Python函數(shù)從上往下運(yùn)行語句菇曲,proc1中print了 jk 冠绢,print前定義了 j, k = 3, 4,因此 #1 的結(jié)果輸出是

j == 3 and k == 4
  • #2

現(xiàn)在我們來說為何#2要被注釋掉了常潮,在#2 print語句之前弟胀,只定義了k的值,而沒有定義 j 的值喊式。如果不注釋掉會報(bào)錯(cuò)

NameError: name 'j' is not defined

有人估計(jì)會問孵户,#1 中不是定義了 j 的值嗎?
因?yàn)閜roc1函數(shù)中的 j岔留、k 值只作用在 Locals 中夏哭,而 #2 中的 j、k 明顯是 Globals 中參數(shù)献联,Globals 是不會從 Locals 去搜尋值的竖配,只能從 builtins 中去尋找,所以“ j is not defined ”里逆。

  • #3

這里值得注意的是进胯, proc2 中先是 定義了 j 值,然后調(diào)用了 proc1()运悲,再 print 語句龄减,所以這里會有2個(gè)輸出
前面說,Python函數(shù)從上往下運(yùn)行語句班眯,那么 proc2 中 proc1 中的 j 值會變成 6 嗎希停?
這里雖然 j 是 proc2 的Locals參數(shù)烁巫,但 proc1 中有自己的Locals,為何要從 proc2 中去 “借”呢宠能?(如果proc1 從 proc2 中取值亚隙,那是閉包的用法了)

所以 proc1() 的結(jié)果是:

j == 3 and k == 4

隨后的 print 結(jié)果:

j == 6 and k == 7

j 是 自己定義的,k 是 Globals 的违崇,如果這里看不懂 k 為何是7阿弃,請從頭再認(rèn)真看一遍

  • #4

這個(gè)沒什么好說的:

j == 8 and k == 7

Summary | 小結(jié)

  • 尋找順序:locals -> enclosing function -> globals -> builtins
  • 官大一級壓死人,事情安排找“下級”
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羞延,一起剝皮案震驚了整個(gè)濱河市渣淳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伴箩,老刑警劉巖入愧,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗤谚,居然都是意外死亡棺蛛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門巩步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旁赊,“玉大人,你說我怎么就攤上這事椅野≈粘” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵鳄橘,是天一觀的道長声离。 經(jīng)常有香客問我,道長瘫怜,這世上最難降的妖魔是什么术徊? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鲸湃,結(jié)果婚禮上赠涮,老公的妹妹穿的比我還像新娘。我一直安慰自己暗挑,他們只是感情好笋除,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炸裆,像睡著了一般垃它。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天国拇,我揣著相機(jī)與錄音洛史,去河邊找鬼。 笑死酱吝,一個(gè)胖子當(dāng)著我的面吹牛也殖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播务热,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忆嗜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崎岂?” 一聲冷哼從身側(cè)響起捆毫,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冲甘,沒想到半個(gè)月后冻璃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡损合,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娘纷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫁审。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赖晶,靈堂內(nèi)的尸體忽然破棺而出律适,到底是詐尸還是另有隱情,我是刑警寧澤遏插,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布捂贿,位于F島的核電站,受9級特大地震影響胳嘲,放射性物質(zhì)發(fā)生泄漏厂僧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一了牛、第九天 我趴在偏房一處隱蔽的房頂上張望颜屠。 院中可真熱鬧,春花似錦鹰祸、人聲如沸甫窟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粗井。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浇衬,已是汗流浹背懒构。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留径玖,地道東北人痴脾。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像梳星,于是被迫代替她去往敵國和親赞赖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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