本文為大家介紹了Python函數作用域的查找順序,供大家參考,具體內容如下
1.什麼是LEGB?
L:local 函數內部作用域
#E:enclosing 函數內部與內嵌函數之間
G:global 全域作用域
#B:build-in 內建作用域
#2.LEGB是作什麼用的?
為什麼非要介紹這個呢?或者說它們的作用是什麼?
原因是因為我們的在學習Python函數的時候,經常會遇到很多定義域的問題,全部變量,內部變量,內部嵌入的函數,等等,Python是如何找到的呢?而Python又是依照什麼順序來查找的呢?這裡做一個順序的說明
3.順序是什麼
跟名字一樣,Python在函數裡面的查找分為4種,稱之為LEGB,也正是依照這種順序來查找的。
首先,是local,先查找函數內部
然後,是enclosing,再查找函數內部與嵌入函數之間(是指在函數內部再次定義一個函數)
其次,是global ,尋找全域
最後,是build-in,內建作用域
4.舉例說明
ex1
passline = 60 def func(val): if val >= passline: print('pass') else: print('failed') func(89) '''''''''''' pass [Finished in 0.2s] ''''''''''''
Python函數首先查找local,在局部變數作用域裡並沒有passline的定義,然後發現函數內部並沒有內嵌函數,這時Python開始查找global,在全域裡查找到passline的定義,被呼叫。
ex2
def Max(val1, val2): return max(val1, val2) print(Max(90, 100)) ''''''''' 100 [Finished in 0.1s] '''''''''
Max函數裡面直接呼叫另外一個函數,呼叫的max()(注意兩個函數的大小寫不一樣),該函數並沒有被定義,但是卻屬於我們上述的第四種,屬於build-in函數,既是在python標準庫裡的函數,內置的,可以直接調用的。最後一步才會查找到這裡
關於第二種,屬於內嵌函數,即使在函數裡面再次定義一個函數,這時會先找local函數裡面是否有定義,然後才會找函數裡面內嵌函數裡面有沒有定義,這一種有專門的名詞,叫做閉包,閉包在之前一些文章都有介紹,希望大家閱讀。
以上就是本文的全部內容,希望對大家的學習有所幫助。
更多Python函數作用域的LEGB順序相關文章請關注PHP中文網!