命名空間.png
作用域
Tips:作用域是針對(duì)變量而言的斟珊,指申明的變量在程序里的可應(yīng)用范圍。或者稱為變量的可見性富纸。
- 內(nèi)建作用域:
- 全局作用域:
- 嵌套作用域:
- 局部作用域:
- 代碼塊不會(huì)產(chǎn)生作用域
命名空間
Tips:命名空間是一個(gè)字典的實(shí)現(xiàn)囤踩,鍵為變量名,值是變量對(duì)應(yīng)的值晓褪。各個(gè)命名空間是獨(dú)立沒有關(guān)系的堵漱,一個(gè)命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響涣仿。
- 內(nèi)置命名空間:Python自帶的內(nèi)建命名空間勤庐,任何模塊均可以訪問示惊,放著內(nèi)置的函數(shù)和異常。
- 全局命名空間:每個(gè)模塊加載執(zhí)行時(shí)創(chuàng)建的愉镰,記錄了模塊中定義的變量米罚,包括模塊中定義的函數(shù)、類丈探、其他導(dǎo)入的模塊录择、模塊級(jí)的變量與常量。
- 局部命名空間:每個(gè)函數(shù)所擁有的命名空間碗降,記錄了函數(shù)中定義的所有變量隘竭,包括函數(shù)的入?yún)ⅰ?nèi)部定義的局部變量讼渊。
生命周期
- 內(nèi)建命名空間:在Python解釋器啟動(dòng)時(shí)創(chuàng)建动看,一直保留到Python解釋器退出。
- 全局命名空間:在模塊被加載時(shí)創(chuàng)建爪幻,通常一直保留到Python解釋器退出菱皆。
- 局部命名空間:在函數(shù)調(diào)用時(shí)才被創(chuàng)建,但返回函數(shù)結(jié)果或拋出異常時(shí)被刪除笔咽。
- Python解釋器加載階段會(huì)創(chuàng)建出內(nèi)建命名空間搔预,模塊的全局命名空間,局部命名空間是在運(yùn)行階段函數(shù)被調(diào)用時(shí)動(dòng)態(tài)創(chuàng)建出來的叶组,函數(shù)調(diào)用結(jié)束動(dòng)態(tài)銷毀拯田。
- 各命名空間的創(chuàng)建順序:Python解釋器啟動(dòng)->創(chuàng)建內(nèi)建命名空間->加載模塊->創(chuàng)建全局命名空間->函數(shù)調(diào)用->創(chuàng)建局部命名空間。
- 各命名空間的銷毀順序:函數(shù)調(diào)用結(jié)束->銷毀函數(shù)對(duì)應(yīng)的局部命名空間->Python虛擬機(jī)(解釋器)退出->銷毀全局命名空間->銷毀內(nèi)建命名空間甩十。
兩個(gè)關(guān)鍵字和兩個(gè)函數(shù)
global
(1)
static_code.png
static_result.png
(2)
static_code.png
static_result.png
- 對(duì)于第一個(gè)程序來說船庇,函數(shù)外的x是全局命名空間的,并綁定的值為2侣监,調(diào)用函數(shù)創(chuàng)建局部命名空間鸭轮,函數(shù)里的x是局部命名空間的,綁定值為4橄霉,互不影響窃爷。
-
對(duì)于第二個(gè)程序來說,同理姓蜂,函數(shù)外的x是全局命名空間的按厘,綁定值為2,調(diào)用函數(shù)創(chuàng)建局部命名空間钱慢,顯然逮京,函數(shù)里的x定義為局部命名空間的變量,x+=2分成兩步執(zhí)行束莫,先執(zhí)行x+2懒棉,再將結(jié)果賦值給x草描。但在執(zhí)行x+2時(shí),局部命名空間的x并沒綁定值策严,所以報(bào)錯(cuò)穗慕。
global.png
global_result.png - 關(guān)鍵字global的作用就是,將局部命名空間的變量申明為全局變量享钞。但是這樣做并不安全揍诽,可以采用參數(shù)和返回值的方法修改全局變量。
nonlocal
local.png
local_result.png
-
與上面同理栗竖,inner中的x并沒綁定值暑脆,所以報(bào)錯(cuò)。
nonlocal.png
nonlocal_result.png - 用nonlocal聲明的變量表示在離它最近一層的局部命名空間里狐肢。
globals()和locals()
- globals():用于查看全局命名空間的變量添吗。
- locals():用于查看當(dāng)前局部命名空間的變量。
- 需要注意的是份名,當(dāng)在全局命名空間使用locals()時(shí)碟联,查看的是全局命名空間的變量。