上一篇文章為:→1.2.2循環(huán)導(dǎo)入
作用域
什么是命名空間
比如有一個(gè)學(xué)校,有10個(gè)班級(jí),在7班和8班中都有一個(gè)叫“小王”的同學(xué),如果在學(xué)校的廣播中呼叫“小王”時(shí),7班和8班中的這2個(gè)人就納悶了,你是喊誰(shuí)呢!!!如果是“7班的小王”的話,那么就很明確了,那么此時(shí)的7班就是小王所在的范圍,即命名空間
globals、locals
在之前學(xué)習(xí)變量的作用域時(shí),經(jīng)常會(huì)提到局部變量和全局變量,之所有稱之為局部、全局,就是因?yàn)樗麄兊淖宰饔玫膮^(qū)域不同,這就是作用域
- locals
day12_其他知識(shí)-01.png
- globals
day12_其他知識(shí)-02.png
LEGB 規(guī)則
Python 使用 LEGB 的順序來(lái)查找一個(gè)符號(hào)對(duì)應(yīng)的對(duì)象
locals -> enclosing function -> globals -> builtins
locals,當(dāng)前所在命名空間(如函數(shù)、模塊),函數(shù)的參數(shù)也屬于命名空間內(nèi)的變量
-
enclosing,外部嵌套函數(shù)的命名空間(閉包中常見(jiàn))
def fun1(): a = 10 def fun2(): # a 位于外部嵌套函數(shù)的命名空間 print(a)
-
globals,全局變量,函數(shù)定義所在模塊的命名空間
a = 1 def fun(): # 需要通過(guò) global 指令來(lái)聲明全局變量 global a # 修改全局變量,而不是創(chuàng)建一個(gè)新的 local 變量 a = 2
-
builtins,內(nèi)建模塊的命名空間。
Python 在啟動(dòng)的時(shí)候會(huì)自動(dòng)為我們載入很多內(nèi)建的函數(shù)、類, 比如 dict,list,type,print,這些都位于 __builtin__ 模塊中, 可以使用 dir(__builtin__) 來(lái)查看。 這也是為什么我們?cè)跊](méi)有 import任何模塊的情況下, 就能使用這么多豐富的函數(shù)和功能了。 在Python中,有一個(gè)內(nèi)建模塊,該模塊中有一些常用函數(shù);在Python啟動(dòng)后, 且沒(méi)有執(zhí)行程序員所寫的任何代碼前,Python會(huì)首先加載該內(nèi)建函數(shù)到內(nèi)存。 另外,該內(nèi)建模塊中的功能可以直接使用,不用在其前添加內(nèi)建模塊前綴, 其原因是對(duì)函數(shù)、變量、類等標(biāo)識(shí)符的查找是按LEGB法則,其中B即代表內(nèi)建模塊 比如:內(nèi)建模塊中有一個(gè)abs()函數(shù),其功能求絕對(duì)值,如abs(-20)將返回20。