在Python中,所有的名字都存在一個空間中,它們在該空間中存在和被操作——這就是命名空間。它就像一個盒子,每一個變量名字都對應(yīng)裝著一個對象。當(dāng)查詢變量的時候,會從該盒子里面找到相應(yīng)的對象。
10年積累的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有云巖免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
【定義】
名稱到對象的映射。命名空間是一個字典的實現(xiàn),鍵為變量名,值是變量對應(yīng)的值。各個命名空間是獨立沒有關(guān)系的,一個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。
相關(guān)推薦:《Python教程》
【分類】
python程序執(zhí)行期間會有2個或3個活動的命名空間(函數(shù)調(diào)用時有3個,函數(shù)調(diào)用結(jié)束后2個)。按照變量定義的位置,可以劃分為以下3類:
Local,局部命名空間,每個函數(shù)所擁有的命名空間,記錄了函數(shù)中定義的所有變量,包括函數(shù)的入?yún)?、?nèi)部定義的局部變量。
Global,全局命名空間,每個模塊加載執(zhí)行時創(chuàng)建的,記錄了模塊中定義的變量,包括模塊中定義的函數(shù)、類、其他導(dǎo)入的模塊、模塊級的變量與常量。
Built-in,python自帶的內(nèi)建命名空間,任何模塊均可以訪問,放著內(nèi)置的函數(shù)和異常。
【生命周期】
Local(局部命名空間)在函數(shù)被調(diào)用時才被創(chuàng)建,但函數(shù)返回結(jié)果或拋出異常時被刪除。(每一個遞歸函數(shù)都擁有自己的命名空間)。
Global(全局命名空間)在模塊被加載時創(chuàng)建,通常一直保留直到python解釋器退出。
Built-in(內(nèi)建命名空間)在python解釋器啟動時創(chuàng)建,一直保留直到解釋器退出。
各命名空間創(chuàng)建順序:python解釋器啟動 -創(chuàng)建內(nèi)建命名空間 - 加載模塊 - 創(chuàng)建全局命名空間 -函數(shù)被調(diào)用 -創(chuàng)建局部命名空間
各命名空間銷毀順序:函數(shù)調(diào)用結(jié)束 - 銷毀函數(shù)對應(yīng)的局部命名空間 - python虛擬機(解釋器)退出 -銷毀全局命名空間 -銷毀內(nèi)建命名空間
python解釋器加載階段會創(chuàng)建出內(nèi)建命名空間、模塊的全局命名空間,局部命名空間是在運行階段函數(shù)被調(diào)用時動態(tài)創(chuàng)建出來的,函數(shù)調(diào)用結(jié)束動態(tài)的銷毀的。
sorted(iterable,cmp,key,reverse)
參數(shù):iterable可以是list或者iterator;
cmp是帶兩個參數(shù)的比較函數(shù);
key
是帶一個參數(shù)的函數(shù);
reverse為False或者True;
舉例說明
(1)用cmp函數(shù)排序
list1
=
[('david',
90),
('mary',90),
('sara',80),('lily',95)]
sorted(list1,cmp
=
lambda
x,y:
cmp(x[0],y[0]))
[('david',
90),
('lily',
95),
('mary',
90),
('sara',
80)]
sorted(list1,cmp
=
lambda
x,y:
cmp(x[1],y[1]))
[('sara',
80),
('david',
90),
('mary',
90),
('lily',
95)]
(2)用key函數(shù)排序
list1
=
[('david',
90),
('mary',90),
('sara',80),('lily',95)]
sorted(list1,key
=
lambda
list1:
list1[0])
[('david',
90),
('lily',
95),
('mary',
90),
('sara',
80)]
sorted(list1,key
=
lambda
list1:
list1[1])
[('sara',
80),
('david',
90),
('mary',
90),
('lily',
95)]
(3)用reverse排序
sorted(list1,reverse
=
True)
[('sara',
80),
('mary',
90),
('lily',
95),
('david',
90)]
(4)用operator.itemgetter函數(shù)排序
from
operator
import
itemgetter
sorted(list1,
key=itemgetter(1))
[('sara',
80),
('david',
90),
('mary',
90),
('lily',
95)]
sorted(list1,
key=itemgetter(0))
[('david',
90),
('lily',
95),
('mary',
90),
('sara',
80)]
介紹operator.itemgetter函數(shù)
import
operator
a
=
[1,2,3]
b
=
operator.itemgetter(0)
b(a)
1
operator.itemgetter函數(shù)獲取的不是值,而是定義了一個函數(shù)。
(5)多級排序
sorted(list1,
key=itemgetter(0,1))
[('david',
90),
('lily',
95),
('mary',
90),
('sara',
80)]
空間復(fù)雜度是O(n)
如果一個命名聲明為全局的,那么對它的所有引用和賦值會直接搜索包含這個模塊全局命名的作用域。如果要重新綁定最里層作用域之外的變量,可以使用 nonlocal 語句;如果不聲明為 nonlocal,這些變量將是只讀的(對這樣的變量賦值會在最里面的作用域創(chuàng)建一個新的局部變量,外部具有相同命名的那個變量不會改變)。
通常,局部作用域引用當(dāng)前函數(shù)的命名。在函數(shù)之外,局部作用域與全局使用域引用同一命名空間:模塊命名空間。類定義也是局部作用域中的另一個命名空間。
重要的是作用域決定于源程序的意義:一個定義于某模塊中的函數(shù)的全局作用域是該模塊的命名空間,而不是該函數(shù)的別名被定義或調(diào)用的位置,了解這一點非常重要。另一方面,命名的實際搜索過程是動態(tài)的,在運行時確定的——然而,Python 語言也在不斷發(fā)展,以后有可能會成為靜態(tài)的“編譯”時確定,所以不要依賴動態(tài)解析!(事實上,局部變量已經(jīng)是靜態(tài)確定了。)
Python 的一個特別之處在于:如果沒有使用 global 語法,其賦值操作總是在最里層的作用域。賦值不會復(fù)制數(shù)據(jù),只是將命名綁定到對象。刪除也是如此:del x 只是從局部作用域的命名空間中刪除命名 x 。事實上,所有引入新命名的操作都作用于局部作用域。特別是 import 語句和函數(shù)定義將模塊名或函數(shù)綁定于局部作用域(可以使用 global 語句將變量引入到全局作用域)。
global 語句用以指明某個特定的變量為全局作用域,并重新綁定它。nonlocal 語句用以指明某個特定的變量為封閉作用域,并重新綁定它。