程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> Python函數作用域的查找順序

Python函數作用域的查找順序

編輯:Python

函數作用域的LEGB順序

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函數裡面是否有定義,然後才會查找函數裡面內嵌函數裡面有沒有定義,這一種有專門的名詞,叫做閉包,閉包將在另外文章裡專門寫到 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved