1.什麼是LEGB?
L:local 函數內部作用域
E:enclosing 函數內部與內嵌函數之間
G:global 全局作用域
B:build-in 內置作用域
2.它們是作什麼用的
為什麼非要介紹這個呢?或者說它們的作用是什麼?
原因是因為我們的在學習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函數裡面是否有定義,然後才會查找函數裡面內嵌函數裡面有沒有定義,這一種有專門的名詞,叫做閉包,閉包將在另外文章裡專門寫到