當前位置:
首頁 > 知識 > Python 的 LEGB 規則

Python 的 LEGB 規則

(點擊

上方藍字

,快速關注我們)




來源:伯樂在線 - 劉志軍


foofish.net/python-legb.html


如有好文章投稿,請點擊 → 這裡了解詳情




理解LEGB前,首先需要對Python的作用域、命名空間有一定的了解,話題才能繼續展開。



命名空間




命名空間表示變數的可見範圍,一個變數名可以定義在多個不同的命名空間,相互之間並不衝突,但同一個命名空間中不能有兩個相同的變數名。比如:兩個叫「張三」的學生可以同時存在於班級A和班級B中,如果兩個張三都是一個班級,那麼帶來的麻煩複雜很多了,在Python中你不能這麼干。




在Python中用字典來表示一個命名空間,命名空間中保存了變數(名字)和對象的映射關係,在Python中命名空間出現在哪些地方呢?有函數範圍內的命名空間(local),有模塊範圍內的命名空間(global),有python內建的命名空間(built-in),還有類對象的所有屬性組成的命名空間。




命名空間的生命周期



所有的命名空間都是有生命周期的,對於python內建的命名空間,python解析器啟動時創建,一直保留直至直python解析器退出時才消亡。而對於函數的local命名空間是在函數每次被調用的時候創建,調用完成函數返回時消亡,而對於模塊的global命名空間是在該模塊被import的時候創建,解析器退出時消亡。




作用域




一個作用域是指一段程序的正文區域,可以是一個函數或一段代碼。一個變數的作用域是指該變數的有效範圍。Python的作用域是靜態作用域,因為它是由代碼中得位置決定的,而命名空間就是作用域的動態表現。




LGB



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






  • global作用域,對應的global命名空間,一個模塊最外層定義的一個作用域。



  • local作用域,對應local命名空間,由函數定義的。



  • builtin作用域,對應builtin命名空間,python內部定義的最頂層的作用域,在這個作用域裡面定義了各種內建函數:open、range、xrange、list等等。




那時的Python作用域規則叫做LEB規則,變數(名字)的引用按照local作用域、global作用域、builtin作用域的順序來查找。




首先來看一段代碼:




a

=

1



def

foo

()

:


a

=

2

print

a

//

[

1

]


print

a

//

[

2

]



foo

()




[1]處輸出結果為2,Python首先會在函數foo定義的local作用域中查找名字a,如果找到了直接輸出,沒有沒找到就會在模塊定義的global作用域中查找,如果還沒找到,就到Python內建的builtin作用域中查找a,如果還沒找到就報異常:NameError: name 『a』 is not defined。引用過程如圖:







2]處輸出結果為1,查找順序同樣是按照LGB規則,只不過這裡的local作用域就是global作用域。




LEGB規則




Python2.2開始引入嵌套函數,嵌套函數為python提供了閉包實現。





a

=

1


def

foo

()

:


a

=

2


def

bar

()

:


print

a

//

[

1

]


return

bar



func

=

foo

()


func

()




函數bar和a=2捆包在一起組成一個閉包,因此這裡a=2即使脫離了foo所在的local作用域,但調用func的時候(其實就是調用bar)查找名字a的順序是LEGB規則,這裡的E就是enclosing的縮寫,代表的「直接外圍作用域」這個概念。查找a時,在bar對應的local作用域中沒有時,然後在它外圍的作用域中查找a。LEGB規定了查找一個名稱的順序為:local–>enclosing–>global–>builtin。






看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

字典對象的 Pythonic 用法(上篇)
Python編寫知乎爬蟲實踐
基於 Python 和 Scikit-Learn 的機器學習介紹

TAG:Python |

您可能感興趣

GoPro Python API
Python 作用域和 LEGB
Python-GUI Tkinter模塊
在RHEL 8中使用Python
wxPython + PyOpenGL 打造三維數據分析的利器!| CSDN 博文精選
1.5 讓VS Code擁有Python的Shell——「系統終端+IPython」
IPython 7.0發布:Async REPL
PowerShell-RAT:一款基於Python的後門程序
GMT/Python(一)
MATLAB-Python-Julia速查表
PPython:PHP 擁抱 Python 的利器
API Star:一個 Python 3 的 API 框架
將Python用於NLP:Pattern 庫簡介
GitHub 熱門項目:Python Fire
在Python中使用JSON
iPhone X 的新解鎖技術:用 Python 編寫 Face ID!
wxPython:python 首選的 GUI 庫
Python FTP簡介
ReportLab: 使用Python將圖表添加到PDF中
Python之父考慮使用 PEG Parser 重構Python解釋器