溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中的LEGB規(guī)則

發(fā)布時(shí)間:2020-08-05 07:48:58 來(lái)源:ITPUB博客 閱讀:205 作者:python交流 欄目:編程語(yǔ)言
前言

理解LEGB前,首先需要對(duì)Python的作用域、命名空間有一定的了解,話題才能繼續(xù)展開(kāi)。

命名空間

命名空間表示變量的可見(jiàn)范圍,一個(gè)變量名可以定義在多個(gè)不同的命名空間,相互之間并不沖突,但同一個(gè)命名空間中不能有兩個(gè)相同的變量名。比如:兩個(gè)叫“張三”的學(xué)生可以同時(shí)存在于班級(jí)A和班級(jí)B中,如果兩個(gè)張三都是一個(gè)班級(jí),那么帶來(lái)的麻煩復(fù)雜很多了,在Python中你不能這么干。

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

命名空間的生命周期

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

作用域

一個(gè)作用域是指一段程序的正文區(qū)域,可以是一個(gè)函數(shù)或一段代碼。一個(gè)變量的作用域是指該變量的有效范圍。Python的作用域是靜態(tài)作用域,因?yàn)樗怯纱a中得位置決定的,而命名空間就是作用域的動(dòng)態(tài)表現(xiàn)。

LGB

Python2.2之前定義了三個(gè)作用域,分別是:

global作用域,對(duì)應(yīng)的global命名空間,一個(gè)模塊最外層定義的一個(gè)作用域。
local作用域,對(duì)應(yīng)local命名空間,由函數(shù)定義的。
builtin作用域,對(duì)應(yīng)builtin命名空間,python內(nèi)部定義的最頂層的作用域,在這個(gè)作用域里面定義了各種內(nèi)建函數(shù):open、range、xrange、list等等。
那時(shí)的Python作用域規(guī)則叫做LEB規(guī)則,變量(名字)的引用按照l(shuí)ocal作用域、global作用域、builtin作用域的順序來(lái)查找。

首先來(lái)看一段代碼:

a = 1
 def foo():
    a = 2
    print a   //[1] 
print a       //[2]
 
foo()

[1]處輸出結(jié)果為2,Python首先會(huì)在函數(shù)foo定義的local作用域中查找名字a,如果找到了直接輸出,沒(méi)有沒(méi)找到就會(huì)在模塊定義的global作用域中查找,如果還沒(méi)找到,就到Python內(nèi)建的builtin作用域中查找a,如果還沒(méi)找到就報(bào)異常:NameError: name ‘a(chǎn)’ is not defined。

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

LEGB規(guī)則

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

a = 1def foo():
   a = 2
   def bar():
        print a  //[1]    return bar
 
func = foo()
func()

函數(shù)bar和a=2捆包在一起組成一個(gè)閉包,因此這里a=2即使脫離了foo所在的local作用域,但調(diào)用func的時(shí)候(其實(shí)就是調(diào)用bar)查找名字a的順序是LEGB規(guī)則,這里的E就是enclosing的縮寫(xiě),代表的“直接外圍作用域”這個(gè)概念。查找a時(shí),在bar對(duì)應(yīng)的local作用域中沒(méi)有時(shí),然后在它外圍的作用域中查找a。LEGB規(guī)定了查找一個(gè)名稱的順序?yàn)椋簂ocal–>enclosing–>global–>builtin。


Python中的LEGB規(guī)則

原文來(lái)自:開(kāi)源中國(guó) 侵刪


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI