python 命名空間沖突_python-命名空間

通俗的來說,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層的命名空間中。

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

來詳細看看這段代碼中的標識符。第1行,適用第一條規則“賦值產生標識符”,因此產生一個標識符g。“賦值的地點決定標識符所處的命名空間”,因為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'層標識符在當前函數內可用。

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改tomcat服務器圖標,修改tomcat小貓圖標,設置項目的favicon圖標

JAVA設計模式之模板模式在閻宏博士的一書中開頭是這樣描述模板方法(Template Method)模式的: 模板方法模式是類的行為模式.準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式 ...從scheduler is shutted down看程序員的英文水平我有個windows服務程序,今天重點在測試…

golang 安全的tcp server_Go 語言使用 TCP_NODELAY 控制發包流量

編寫健壯且高性能的網絡服務需要付出大量的努力。提高服務性能的方式有很多種,比如優化應用層的代碼,更進一步,還可以看看垃圾回收器,操作系統,網絡傳輸,以及部署我們服務的硬件是否有優化空間。TCP/IP 協議…

react取消所有請求_react 組件關閉后怎么消除還在進行中的ajax

把你的請求做成可以取消的, 這里的取消不是取消發送。 因為請求已經發送了,沒有辦法終止的。所謂的取消其實就是取消回調函數, react官方給出了一種最佳實踐。const makeCancelable (promise) > { let hasCanceled_ false; const wrap…

css 漣漪,CSS3水波漣漪動畫定位樣式如何制作

CSS3水波漣漪動畫定位樣式如何制作寶劍鋒從磨礪出,梅花香自苦寒來。以下是小編為大家搜索整理的CSS3水波漣漪動畫定位樣式如何制作,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!先上效果圖:教程本動畫需要用到的主要屬性:animatio…

python基礎實訓_python基礎實踐(三)

-*-列表是新手可直接使用的最強大的python功能之一,它融合了眾多重要的編程概念。-*-# -*- coding:utf-8 -*-# Author:sweeping-monkQuestion_1 "什么是列表?"print(Question_1)smg "列表由一系列按特定順序排列的元素組成。你可以創建…

python axis 0 1_python pandas 中axis值0 1怎么分行還是列

axis的重點在于方向,而不是行和列。1表示橫軸,方向從左到右;0表示縱軸,方向從上到下。即axis1為橫向,axis0為縱向,而不是行和列,具體到各種用法而言也是如此。當axis1時,如果是求平均…

ajax php接收不到數據庫,PHP更新MySQL數據庫與AJAX調用沒有做任何事情

我已經測試過,發現正確的數據被發送,但PHP更新數據庫中的字段即處理更新無法正常工作。發生的一切就是我在條件中得到了else響應。我需要根據用戶輸入是什么來更新數據庫。就像我說的,我得到的回應是else回應。$youruname $_POST[youruname]…

就業技術書文件表格_公路工程全套資料—開工施工檢驗等表格范本,及監理內業常用資料...

關鍵詞:開工報告、 路基、排水、小橋、涵洞、水泥、瀝青、混凝土、施工檢驗、監理、資料整理、基層,內業資料,監理資料,施工試驗報告等。公路工程在管理、監理、施工過程中需及時、準確、完整地收集整理項目建設中各種檔案資料&am…

龍神契約為什么顯示服務器錯誤,龍神契約連服BOSS玩法介紹

龍神契約游戲中連服戰場的游戲中的一個非常重要的部分,而其中的boss尤為重要。擊殺boss玩家可以獲得非常多的獎勵,一般一下稀有材料都是可以獲得的,所以打boss是重中之重的。今天小編簡單給大家介紹一下。有興趣的小伙伴千萬不要錯過。和小編…

python批量新建文件_python批量處理

python opencv圖像二值化批量處理from skimage import data_dir,io,transform,color,filtersimport numpy as npimport cv2def convert_gray(f):rgbio.imread(f) #依次讀取rgb圖片#grayfilters.gaussian(rgb, sigma1, outputNone, modenearest, cval0, multichannelNone, prese…

dns電腦服務器發生故障怎么修復,電腦dns服務器發生故障怎么解決

一、DNS簡介:DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機…

button設置disabled屬性不生效_jQuery屬性節點

發現了很好玩的表情可以插入嘻嘻嘻嘻嘻嘻嘻 1.attr屬性操作 在jQuery中,可以通過attr()方法操作屬性,可以是固有屬性,也可以是自定義屬性。1.1 設置屬性值// 設置單個屬性 $("div").attr("title", "我是一個div&quo…

server_u文件服務器已停止,Serv-U停止服務怎么解決

近期很多朋友在使用Serv-U來架設FTP服務器時候,總會出現自動停止服務的現象,一旦停止就不能保證工作的正常運作,那么Serv-U停止服務怎么解決,下面跟隨愛站技術頻道小編來看看吧!因為這個ftp服務很重要,要保…

如何知道電腦服務器操作系統,電腦如何查看服務器操作系統

電腦如何查看服務器操作系統 內容精選換一換北京時間1月3日,Intel處理器芯片被曝出存在嚴重的Meltdown和Spectre安全漏洞,漏洞詳情如下:漏洞名稱:Intel處理器存在嚴重芯片級漏洞漏洞編號:CVE-2017-5753、CVE-2017-5715…

哈哈機器人送到冰雪小鎮_從小鎮到上海:兩代人的接力洄游 | 活動回顧

10月24日,在上海思南公館,作家路明圍繞著自己的新書《出小鎮記》,和蘇更生、景蠻蠻一起,向現場觀眾講述了小鎮和上海的故事。路明:我媽媽是69屆的初中生,他們69屆那些人走的時候,69屆是一片紅&a…

云服務器php版本修改,云服務器 更改php版本

云服務器 更改php版本 內容精選換一換本節操作介紹在管理控制臺創建啟動模板的操作步驟。每個賬號在每個區域最多可創建30個啟動模板。創建啟動模板時,所有配置項均為可選。但如果缺失了創建實例的必要參數,例如規格、鏡像類型,那么在使用該模…

opencv獲得圖片的像素寬度_使用OpenCV實現攝像頭測距

原文鏈接:Find distance from camera to object using Python and OpenCV?www.pyimagesearch.com攝像頭測距就是計算照片中的目標物體到相機的距離。可以使用相似三角形(triangle similarity)方法實現,或者使用更復雜但更準確的相…

ios下js復制到粘貼板_EXCEL被你忽視的粘貼板-11

這一節我們來聊聊粘貼板的用途,什么?你居然沒用過粘貼板?平時只是ctrlc,然后ctrlv,好吧,那我們看看粘貼板到底能干些啥。1、提取區域內的內容有時我們選擇一塊區域發給同事,但當他需要編輯時發現居然是圖片…

機器人 林州重機_林州重機募資11億布局油氣和機器人項目

OFweek工控網訊:林州重機7月31日晚間公布非公開發行股票預案,公司計劃向包括公司控股股東郭現生、股東、原董事宋全啟在內的不超過10名的特定對象非公開發行股票數量為不超過15000萬股,發行價格不低于7.42元/股,募集資金總額不超過…

ros構建機器人運動學模型_ROS入門學習之八機器人綜合應用

1.ROS機器人實例介紹(PR2,Turtlebot,HRMRP,Kungfu Arm)1).PR2:造就了ROS的機器人平臺,完全基于ROS開發,功能豐富、強大2).Turtlebot:ROS社區中最流行的高性價比機器人平臺,前后工發布三代3).Universal Robot:工業領域的協作機器人定義者4).HR…