亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python命名空間詳解

系統 1524 0

通俗的來說,Python中所謂的命名空間可以理解為一個容器。在這個容器中可以裝許多標識符。不同容器中的同名的標識符是不會相互沖突的。理解python的命名空間需要掌握三條規則:

第一, 賦值(包括顯式賦值和隱式賦值)產生標識符,賦值的地點決定標識符所處的命名空間 。

第二, 函數定義(包括def和lambda)產生新的命名空間 。

第三, python搜索一個標識符的順序是"LEGB"。

所謂的"LEGB"是python中四層命名空間的英文名字首字母的縮寫。
最里面的一層是L(local),表示在一個函數定義中,而且在這個函數里面沒有再包含函數的定義。
第二層E(enclosing function),表示在一個函數定義中,但這個函數里面還包含有函數的定義,其實L層和E層只是相對的。
第三層G(global),是指一個模塊的命名空間,也就是說在一個.py文件中定義的標識符,但不在一個函數中。
第四層B(builtin),是指python解釋器啟動時就已經具有的命名空間,之所以叫builtin是因為在python解釋器啟動時會自動載入__builtin__模塊,這個模塊中的list、str等內置函數的就處于B層的命名空間中。

這三條規則通過一個例子來看比較明白。如下面例子所示:

            
>>> g = int('0x3', 0)
>>> def outFunc():
  e = 2
    g = 10
  def inFunc():
     l = 1
     return g + e
    return inFunc()
>>> outFunc() ===> 12


          

來詳細看看這段代碼中的標識符。
第1行,適用第一條規則“賦值產生標識符”,因此產生一個標識符g?!百x值的地點決定標識符所處的命名空間”,因為g是沒有在一個函數定義中,因此g處于'G'層命名空間中。這一行中還有一個標識符,那就是int。那么int是在什么地方定義的呢?由于int是內置函數,是在__builtin__模塊中定義的,所以int就處于'B'的層命名空間中。
第2行,適用第一條規則,由于def中包含一個隱性的賦值過程,這一行產生一個標識符outFunc,outFunc并不處于一個函數定義的內部,因此,outFunc處于'G'層命名空間中。此外,這一行還適用第二條規則,產生一個新的命名空間。
第3行,適用第一條規則,產生個標識符e,而且由于這是在一個函數定義內,并且內部還有函數定義,因此e處于'E'層命名空間中。
第4行要注意,適用第一條規則,產生一個標識符g,這個g與e一樣外于'E'層命名空間中。這個g與第一行的g是不同的,因為所處的命名空間不一樣。
第5行,適用第一條規則,產生一個處于'E'層命名空間的標識符inFunc。與第2行一樣,這一行定義函數也產生一個新的命名空間。
第6行,適用第一條規則,產生一個標識符l,由于這個l處于一個函數內部,而且在這個函數內部沒有其他函數的定義,因此l處于'L'層命名空間中。
第7行,適用第三條規則,python解釋器首先看到標識符g,按照LEGB的順序往上找,先找L層(也就是在inFunc內部),沒有。再找E層,有,值為10。因此這里的g的值為10。尋找過程到為止,并不會再往上找到'G'層。尋找e的過程也一樣,e的值為2。因此第9行的結果為12。

其實,所謂的“LEGB”是為了學術上便于表述而創造的。讓一個編程的人說出哪個標識符處于哪個層沒有什么意義,只要知道對于一個標識符,python是怎么尋找它的值的就可以了。其實找值的過程直觀上也很容易理解。

通過上面的例子也可以看出,如果在不同的命名空間中定義了相同的標識符是沒有關系的,并不會產生沖突。尋找一個標識符的值過程總是從當前層開始往上找的,首先找到的就為這個標識符的值。也由此可以這么說,'B'層標識符在所有模塊(.py文件)中可用;'G'層標識符在當前模塊內(.py文件)中可用;'E'和'L'層標識符在當前函數內可用。

再來看一個例子,來解釋global語句的用法。代碼如下所示:

            
>>> g = 'global'
>>> s = 'in'
>>> def out():
    g = 'out'
    def inter():
     global g     
     print s,g
  inter()
>>> out() ===> 'in global'


          

可以看到,雖然有兩個層中的g,但使用了global語句后,就是指'G'層的標識符。也就是第7行中的g,就是指第1行產生的那個g,值為'global'。

最后說一句,其實只要在編程的時候注意一下,不要使用相同的標識符,基本上就可以避免任何與命名空間相關的問題。還有就是在一個函數中盡量不要使用上層命名空間中的標識符,如果一定要用,也最好使用參數傳遞的方式進行,這樣有利于保持函數的獨立性。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费观看国产一区二区三区 | 2021久久伊人精品中文字幕有 | 99成人在线 | 玖玖在线视频 | 天天干夜夜做 | 亚洲一区二区三区免费视频 | 欧美成人免费香蕉 | 国产精品2020在线看亚瑟 | 久久精品免看国产成 | 日本不卡在线视频高清免费 | 国产精品亚洲精品影院 | 色久优优 欧美色久优优 | 国产日韩精品一区在线观看播放 | 在线亚洲精品国产成人二区 | 色综合h| 99爱在线观看精品视频 | 成人精品福利 | 91在线视频在线观看 | 国产精品国内免费一区二区三区 | 成人精品视频一区二区三区 | 免费永久国产在线视频 | 一级毛片日韩a欧美 | 玖玖国产精品 | 欧美一区二区三区视频在线观看 | 久热精品视频在线播放 | 日本一区二区三区四区 | 国产一级αv片免费观看 | 国产精品揄拍100视频 | 欧美日韩精品一区二区三区四区 | 色综合久久综合网欧美综合网 | 日韩伦理一区二区 | 日本人成18在线播放 | 免费成人高清视频 | 久久穴 | 色偷偷亚洲精品一区二区 | 日本a在线 | 国产性精品| 奇米在线视频777 | 久久精品国产99久久香蕉 | 亚洲精品乱码一区二区在线观看 | 四虎免费观看 |