亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

深入理解Python中命名空間的查找規則LEGB

2020-01-04 17:59:14
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了深入理解Python中命名空間的查找規則LEGB,作者根據Python3.x版本進行講解,需要的朋友可以參考下

名字空間

Python 的名字空間是 Python 一個非常核心的內容。

其他語言中如 C 中,變量名是內存地址的別名,而在 Python 中,名字是一個字符串對象,它與他指向的對象構成一個{name:object}關聯。

Python 由很多名字空間,而 LEGB 則是名字空間的一種查找規則。

作用域

Python 中name-object的關聯存儲在不同的作用域中,各個不同的作用域是相互獨立的。而我們就在不同的作用域中搜索name-object。

舉個栗子,來說明作用域是相互獨立的。

 

 
  1. In [11]: i = "G" 
  2.  
  3. In [12]: def test(): 
  4. i = "L" 
  5. print i, "in locals" 
  6. ....: 
  7.  
  8. In [13]: test() 
  9. in locals 
  10.  
  11. In [14]: print i, "in globals" 
  12. in globals 

在上面的栗子中,我們定義了兩次 i,在 test 函數中是 i-L,在外面是 i-G。為什么在 test 函數中,我們 i 指向的是對象 L,而在外面,i 指向的則是 G?這就是 LEGB 的作用。

簡述

簡而言之,LEGB 代表名字查找順序: locals -> enclosing function -> globals -> __builtins__

locals 是函數內的名字空間,包括局部變量和形參

enclosing 外部嵌套函數的名字空間(閉包中常見)

globals 全局變量,函數定義所在模塊的名字空間

builtins 內置模塊的名字空間

所以,在 Python 中檢索一個變量的時候,優先回到 locals 里面來檢索,檢索不到的情況下會檢索 enclosing ,enclosing 沒有則到 globals 全局變量里面檢索,最后是到 builtins 里面來檢索。

當然,因為 builtins 的特殊性,我們可以直接在 builtins 里面添加變量,這樣就可以在任意模塊中訪問變量,不過這種方法太過于變態,不推薦這么做。

locals,globals

函數的形參跟內部變量都存儲在 locals 中。

 

 
  1. In [1]: def f(x): 
  2. ...: a = x 
  3. ...: print a 
  4. ...: print locals() 
  5. ...: 
  6.  
  7.  
  8. In [2]: f("hello"
  9. hello 
  10. {'a''hello''x''hello'

不過在函數內部調用global 聲明的時候,可以將變量存儲在 globals 中

 

 
  1. In [6]: def f(x): 
  2. ...: global a 
  3. ...: a = x 
  4. ...: print a 
  5. ...: print locals() 
  6. ...: 
  7.  
  8. In [7]: f("hello"
  9. hello 
  10. {'x''hello'
  11.  
  12. In [8]: print a 
  13. hello 
  14.  
  15. In [9]: print x 
  16. --------------------------------------------------------------------------- 
  17. NameError Traceback (most recent call last) 
  18. <ipython-input-9-2d264e11d975> in <module>() 
  19. ----> 1 print x 
  20.  
  21. NameError: name 'x' is not defined 

如上面栗子中那樣,在函數中聲明 a 為全局變量,則函數 f 的 locals只有參數 x,而沒有變量,而在外部可以使用變量 a,而使用 x 的時候則是NameError

Enclosed

Enclosing 是外部嵌套函數的名字空間。我們經常在閉包中用到。在 Python3中提供了一個 nonlocal關鍵字來修改外部嵌套函數的名字空間,但是要使用 Python3才有,我等使用 Python2的只能眼饞一下。

 

 
  1. In [11]: def outer(): 
  2. ....: a_var = 'enclosed value' 
  3. ....: print a_var 
  4. ....: def inner(): 
  5. ....: a_var = 'local value' 
  6. ....: print(a_var) 
  7. ....: inner() 
  8. ....: print a_var 
  9. ....: 
  10.  
  11. In [12]: outer() 
  12. enclosed value 
  13. local value 
  14. enclosed value 

下面的栗子簡單示范一下 nonlocal 的用法,實在 Python3下面才可以正常運行的:

 

 
  1. In [1]: a_var = 'global value' 
  2.  
  3. In [2]: def outer(): 
  4. ...: a_var = "local value" 
  5. ...: print("outer befor", a_var) 
  6. ...: def inner(): 
  7. ...: nonlocal a_var 
  8. ...: a_var = "inner value" 
  9. ...: print("in inner():", a_var) 
  10. ...: inner() 
  11. ...: print("outer inner:", a_var) 
  12. ...: 
  13.  
  14. In [3]: outer() 
  15. outer befor local value 
  16. in inner(): inner value 
  17. outer inner: inner value 
  18.  
  19. In [4]: print(a_var) 
  20. global value 

builtins

builtins 則是內置模塊,輕易不要修改

 

 
  1. In [19]: b 
  2. --------------------------------------------------------------------------- 
  3. NameError Traceback (most recent call last) 
  4. <ipython-input-19-3b5d5c371295> in <module>() 
  5. ----> 1 b 
  6.  
  7. NameError: name 'b' is not defined 
  8.  
  9. In [20]: __builtins__.b = "builtins" 
  10.  
  11. In [21]: b 
  12. Out[21]: 'builtins' 

上面栗子中在第一次調用b的時候報錯NameError,之后我們修改 builtins 的名字空間,將名字b與值"builtins"進行關聯,就可以正常調用了。這種非常規用法不建議使用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区四区在线观看视频| 欧美又大粗又爽又黄大片视频| 国产精品一区二区三区毛片淫片| 富二代精品短视频| 91在线视频一区| 一区二区三欧美| 粉嫩av一区二区三区免费野| 国精产品一区一区三区有限在线| 国产精品一区久久| 亚洲一级黄色av| 欧美激情高清视频| 久久久国产一区二区三区| 亚洲免费伊人电影在线观看av| 亚洲激情在线观看视频免费| 久久手机精品视频| 成人a免费视频| 亚洲裸体xxxx| 国产成人鲁鲁免费视频a| 国产精品网站视频| 欧美最猛性xxxxx免费| 久热国产精品视频| 国产日韩在线精品av| 中文字幕欧美日韩在线| 亚洲成人黄色网址| 97精品国产97久久久久久| 色偷偷av一区二区三区| 伊人伊成久久人综合网站| 欧美激情视频在线观看| 国产精品日韩在线| 欧美成人精品一区二区三区| 日韩中文字幕精品视频| 日本精品久久电影| 久久精品成人欧美大片| 欧美成人激情视频免费观看| 欧美中文在线免费| 亚洲一区二区三区xxx视频| 亚洲国模精品一区| 欧美性20hd另类| 亚洲福利视频网| 黑人精品xxx一区一二区| 在线观看不卡av| 97国产一区二区精品久久呦| 国产精品视频一区二区三区四| 精品国产一区二区在线| 久久久久久久999精品视频| 欧美性猛交xxxx乱大交极品| 精品久久久久久久久久ntr影视| 92看片淫黄大片欧美看国产片| 亚洲一区制服诱惑| 久久久亚洲国产天美传媒修理工| 日韩av在线高清| 亚洲成人激情小说| 91理论片午午论夜理片久久| 欧美日韩中文在线| 亚洲一区制服诱惑| 久久中文久久字幕| 精品视频www| 色偷偷偷综合中文字幕;dd| 中文字幕国产精品久久| 国产精品久久91| 国产精品视频在线观看| 成人午夜激情免费视频| 国产精品高潮在线| 亚洲欧美激情精品一区二区| 久久av资源网站| 欧美午夜xxx| 亚州av一区二区| 两个人的视频www国产精品| 欧美日韩国产在线看| 亚洲视频日韩精品| 97成人超碰免| 久久九九国产精品怡红院| 一区二区三区回区在观看免费视频| 欧美精品精品精品精品免费| 国产精品美女主播| 永久免费毛片在线播放不卡| 日本最新高清不卡中文字幕| 欧美日韩国产精品一区| www.日韩免费| 亚洲精品国精品久久99热| 久久精品亚洲94久久精品| 欧美理论电影网| 亚洲成人亚洲激情| 俺也去精品视频在线观看| 亚洲高清av在线| 欧美激情精品久久久久久| 欧美一区二粉嫩精品国产一线天| 成人免费观看a| 亚洲男人天堂手机在线| 欧美激情视频一区| 亚洲国内精品视频| 福利视频一区二区| 日韩成人小视频| 日韩综合视频在线观看| 在线观看国产欧美| 色诱女教师一区二区三区| 成人免费视频97| 久久国产精品99国产精| 久久久久久久一区二区| 亚洲国产精品久久91精品| 国产精品久久电影观看| 欧美综合在线观看| 日本欧美爱爱爱| 欧美做受高潮1| 国产精品精品一区二区三区午夜版| 亚洲理论片在线观看| 欧美成人国产va精品日本一级| 欧美激情伊人电影| 国产在线精品一区免费香蕉| 成人激情视频在线播放| 高清在线视频日韩欧美| 91久久精品国产| 国产精品入口日韩视频大尺度| 一个人看的www久久| 日韩av影视综合网| 中文字幕亚洲情99在线| 日韩精品在线视频美女| 夜夜狂射影院欧美极品| 51久久精品夜色国产麻豆| 中文国产成人精品| 亚洲人免费视频| 精品人伦一区二区三区蜜桃网站| 久久在精品线影院精品国产| 久久精品福利视频| 久久国产精品偷| 国产精品久久久久免费a∨| 国产福利精品在线| 欧美一区二区三区四区在线| 操日韩av在线电影| 久久免费视频在线观看| 亚洲国产精品va在线看黑人动漫| 欧美日韩国产二区| 欧美亚洲在线观看| 久久夜色精品国产亚洲aⅴ| 国产精品亚洲视频在线观看| 成人xxxx视频| 亚洲欧美国产一区二区三区| 国产一区二区三区高清在线观看| 777精品视频| 国产黑人绿帽在线第一区| 欧美激情成人在线视频| 欧美日韩色婷婷| 国产精品色悠悠| 久久久亚洲福利精品午夜| 欧美裸体视频网站| 亚洲人成啪啪网站| 日韩最新免费不卡| 91视频国产高清| 亚洲少妇中文在线| 一区二区三区视频免费| 欧美精品18videos性欧| 美女扒开尿口让男人操亚洲视频网站| 欧美国产日韩一区二区在线观看| 欧美成在线视频| 国产91在线高潮白浆在线观看| 91日韩在线播放| 国内精品美女av在线播放| 亚洲精品美女免费| 国产精品视频精品| 欧洲亚洲免费视频| 国产在线播放不卡| 成人做爽爽免费视频| 色婷婷综合久久久久中文字幕1| 性欧美激情精品|