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