欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python命名空間詳解

 更新時間:2014年08月18日 15:22:16   投稿:shichen2014  
這篇文章主要介紹了Python命名空間詳解,非常重要的概念,需要的朋友可以參考下

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

第一,賦值(包括顯式賦值和隱式賦值)產(chǎn)生標(biāo)識符,賦值的地點(diǎn)決定標(biāo)識符所處的命名空間

第二,函數(shù)定義(包括def和lambda)產(chǎn)生新的命名空間

第三,python搜索一個標(biāo)識符的順序是"LEGB"。

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 如何基于Python深度圖生成3D點(diǎn)云詳解

    如何基于Python深度圖生成3D點(diǎn)云詳解

    通常使用TOF等3d攝像頭采集的格式一般只是深度圖,下面這篇文章主要給大家介紹了關(guān)于如何基于Python深度圖生成3D點(diǎn)云的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Python+matplotlib實(shí)現(xiàn)華麗的文本框演示代碼

    Python+matplotlib實(shí)現(xiàn)華麗的文本框演示代碼

    這篇文章主要介紹了Python+matplotlib實(shí)現(xiàn)華麗的文本框演示代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置代碼(推薦)

    Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置代碼(推薦)

    這篇文章主要介紹了Python地理地圖可視化folium標(biāo)記點(diǎn)彈窗設(shè)置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 探究Python中isalnum()方法的使用

    探究Python中isalnum()方法的使用

    這篇文章主要介紹了探究Python中isalnum()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • 探索Python神奇算術(shù)用代碼輕松求和的幾種方法

    探索Python神奇算術(shù)用代碼輕松求和的幾種方法

    求和是數(shù)學(xué)中最基本的運(yùn)算之一,也是編程中常見的任務(wù)之一,Python 提供了多種方法來計算和求和數(shù)字,本文將掏出計算求和的不同方法,包括使用循環(huán)、內(nèi)置函數(shù)以及第三方庫
    2023-11-11
  • 深入了解Python并發(fā)編程

    深入了解Python并發(fā)編程

    讓計算機(jī)程序并發(fā)的運(yùn)行是一個經(jīng)常被討論的話題,這篇文章將具體介紹一下Python下的各種并發(fā)方式。感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-01-01
  • 詳解python中的線程

    詳解python中的線程

    Python中創(chuàng)建線程有兩種方式:函數(shù)或者用類來創(chuàng)建線程對象。這篇文章主要介紹了python中的線程,需要的朋友可以參考下
    2018-02-02
  • python基于Bokeh庫制作子彈圖及瀑布圖示例教程

    python基于Bokeh庫制作子彈圖及瀑布圖示例教程

    這篇文章主要為大家介紹了python基于Bokeh庫制作子彈圖及瀑布圖的實(shí)現(xiàn)示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • pycharm遠(yuǎn)程調(diào)試openstack的圖文教程

    pycharm遠(yuǎn)程調(diào)試openstack的圖文教程

    這篇文章主要為大家詳細(xì)介紹了pycharm遠(yuǎn)程調(diào)試openstack的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 詳解Python3 pickle模塊用法

    詳解Python3 pickle模塊用法

    pickle模塊中的兩個主要函數(shù)是dump()和load(),這篇文章主要介紹了Python3 pickle模塊用法,需要的朋友可以參考下
    2019-09-09

最新評論