python中的命名空间指什么_13.Python中的命名空间是什么
Python中的命名空間是什么?
In Python,every name introduced has a place where it lives and can be hooked for.
This is known as namespace. It is like a box where a variable name is mapped to the object placed.
Whenever the variable is searched out, this box will be searched, to get corresponding object.
namespace命名空間
Namespace(只)是?從名字到對象的一個映射(a mapping from name to objects)?。大部分namespace都是按Python中的字典來實現(xiàn)的。
有一些常見的namespace:built-in中的集合(?abs()?函數(shù)等)、一個模塊中的全局變量等。
從某種意義上來說,一個對象(object)的所有屬性(attribute)也構(gòu)成了一個namespace。在程序執(zhí)行期間,可能(其實是肯定)會有多個命名空間同時存在。不同namespace的創(chuàng)建/銷毀時間也不同。
此外,兩個不同namespace中的兩個相同名字的變量之間沒有任何聯(lián)系。
scope作用域
Scope是Python程序的一塊文本區(qū)域(textual region)。
在該文本區(qū)域中,對namespace是可以直接訪問,而不需要通過屬性來訪問。
Scope是定義程序該如何搜索確切地“名字-對象”的名空間的層級關(guān)系。
(The “scope” in Python defines the “hirerchy level” in which we search namespaces for
certain “name-to-object” mappings.)
Tip
直接訪問:對一個變量名的引用會在所有namespace中查找該變量,而不是通過屬性訪問。
屬性訪問:所有名字后加?.?的都認為是屬性訪問。
如?module_name.func_name?,需要指定?func_name?的名空間,屬于屬性訪問。
而?abs(-1)?,?abs?屬于直接訪問。
那什么是命名空間/作用域呢?
這兩個概念,是用來描述一個變量的屬性的,它們的意思,就是字面意思:“這個變量起名字的地方/這個變量起作用的域”.
LEGB-rule
在一個Python程序運行中,至少有4個scopes是存在的。
直接訪問一個變量可能在這四個namespace中逐一搜索。
Local(innermost)包含局部變量。
比如一個函數(shù)/方法內(nèi)部。
Enclosing包含了非局部(non-local)也非全局(non-global)的變量。
比如兩個嵌套函數(shù),內(nèi)層函數(shù)可能搜索外層函數(shù)的namespace,但該namespace對內(nèi)層函數(shù)而言既非局部也非全局。
Global(next-to-last)當前腳本的最外層。
比如當前模塊的全局變量。
Built-in(outtermost)Python?__builtin__?模塊。
包含了內(nèi)建的變量/關(guān)鍵字等。
那么,這么多的作用域,Python是按什么順序搜索對應(yīng)作用域的呢?
著名的”LEGB-rule”,即scope的搜索順序:
Important
Local -> Enclosing -> Global -> Built-in
怎么個意思呢?
當有一個變量在?local?域中找不到時,Python會找上一層的作用域,即?enclosing?域(該域不一定存在)。enclosing?域還找不到的時候,再往上一層,搜索模塊內(nèi)的?global?域。最后,會在?built-in?域中搜索。對于最終沒有搜索到時,Python會拋出一個?NameError?異常。
作用域可以嵌套。比如模塊導(dǎo)入時。
這也是為什么不推薦使用?from?a_module?import?*?的原因,導(dǎo)入的變量可能被當前模塊覆蓋。
參考:http://www.cnblogs.com/sunchao1984/p/5377680.html
http://python.jobbole.com/81367/
總結(jié)
以上是生活随笔為你收集整理的python中的命名空间指什么_13.Python中的命名空间是什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 《21天学通C语言》总结(2)
- 下一篇: 苹果开发者地址1
