Python3.2官方文档翻译--作用域和命名空间
6.2?Python作用域和命名空間
在介紹類之前。首先我想告訴你一些關于python作用域的規則。
類的定義很巧妙地運用了命名空間,你須要知道范圍和命名空間的工作原理以能全面了解接下來發生的。?順便說一下,關于這節講到的知識對于不論什么優秀的python程序猿很實用。
讓我們開始以一些定義開始。
命名空間(namespace)是一個從名稱到對象的映射。大多命名空間眼下用Python字典實現的,但那通常不會被注意(除非為了性能),在將來它能夠改變。命名空間的樣例是:內置名稱的set(包括函數如abs()和內置異常名稱)。在模塊中的全局變量名稱;在函數調用時的局部名稱。在一定程度上對象的屬性賦值形成一個命名空間。掌握命名空間的重要事情是在不同的命名空間絕對沒有關系。比如。兩個不同的模塊都能夠不混淆的定義方法maximize。模塊的用戶必須用模塊名稱為前綴。?
隨便說一下。我習慣上吧每個跟在點號(.)后面的屬性都稱為屬性(attribute)。
比如在表達式z.real。Real是對象z的一個屬性。嚴格意義上講。在模塊中引用的名稱都是屬性的引用:在表達式modname.funcname,modname是一個模塊對象和funcnam是它的一個屬性。?在這個樣例,這恰好是在于模塊屬性和在模塊定義中的全局變量名稱之間的一個簡單的映射:它們共享相同的命名空間。
屬性是可讀的或者是可寫的。在后一種情況下。同意對屬性賦值。假設模塊屬性是可寫的,你能夠這么寫。modername.the_answer?=?42.?可寫屬性也能夠用del語句刪除。比如。del?modname.the_answer將會從名叫modname模塊中移除屬性?the_answer。
命名空間能夠在不同的時間里存在而且有不同的生命周期。
當python解釋器啟動時,包括內置名稱的命名空間就會創建。而且從不刪除。當模塊定義讀入時,模塊的全局命名空間就會創建。正常來說。模塊命名空間一直存在直到解釋器退出。
通過解釋器的頂層調用運行。從腳本文件里讀取或者交互,都覺得是_main_模塊的一部分,因此他們也有自己的全局命名空間。(內置名稱實際也存在于一個模塊。稱為builtins.)
當函數調用時函數的局部命名空間就會創建,當函數返回值或者拋出在方法中沒有處理的異常時,就會刪除。當然,每一個遞歸調用都有自己的局部命名空間。
作用域就是一個python程序能夠直接訪問命名空間的正文區域。
這里“直接訪問”的意思就是一個名稱的非法引用試圖在命名空間中尋找名稱。
雖然作用域都是靜態定義,可是它們動態使用。
在運行過程中的不論什么時候,至少有給三個關聯的命名空間能夠直接訪問的作用域:
l?首先被查的是包括局部變量的最內層作用域?
l?不論什么關閉函數的作用域。它們以近期封裝的作用域開始進行查詢,包括的不是局部變量也不是非全局變量。
l?接著查詢包括當前模塊全局變量的作用域。
l?最后查詢的就是最外面的作用域,它是包括內置方法的命名空間。
假設名稱定義為全局的,那么全部的引用和賦值都能夠直接給包括模塊全局變量的中間作用域。
為了又一次綁定在最內層作用域外面發現的變量,nonlocal語句能夠使用。假設未定義為非本地,這邊變量僅僅能讀取。(讀取這樣的變量的嘗試就會在最內層作用域中產生一個本地局部變量,而外部那個同樣標識符的變量不會改變)
通常,局部作用域引用當前函數的局部變量。
函數外面,局部作用域引用引用和全局作用一樣的命名空間:模塊命名空間。類定義也會在局部作用域中引入還有一個命名空間。
知道作用域能夠在文本中定義是很重要的。
在模塊中定義函數的全局作用域是那個模塊的命名空間,無論函數從哪里或者用何種名稱調用。還有一方面,對名稱的真正查詢是在執行時候動態查詢的。可是。語言的定義正在向編譯時靜態名稱確定進化。因此不要依賴動態名稱解決。(其實,局部變量已經靜態定義了)
?
?Python一個特別之處是--假設沒有全局變量有效--名稱的賦值經常進入最內層的范圍。賦值不會拷貝數據--它們緊緊是把名稱綁定在對象上。刪除也是一樣。Del語句就會移除從局部作用域的命名空間去掉與x的綁定。
其實。介紹新名稱的全部操作都用局部變量,特別是,import語句和函數定義在局部局部作用域中綁定模塊或者函數名稱。
Global語句能夠用來描寫敘述活動在全局作用域中的特別變量而且應該綁定在那里。Nonlocal語句描寫敘述活動在封裝作用域中的特別變量并在那里綁定。
轉載于:https://www.cnblogs.com/mfrbuaa/p/5196281.html
總結
以上是生活随笔為你收集整理的Python3.2官方文档翻译--作用域和命名空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晚上梦到吃鱼是什么意思
- 下一篇: php中json_decode()和js