首頁  >  文章  >  後端開發  >  Python函數作用域的LEGB順序

Python函數作用域的LEGB順序

高洛峰
高洛峰原創
2017-03-02 16:47:001161瀏覽

本文為大家介紹了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中文網!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn