python的命名空间_python中命名空间的三种方式介绍(附示例)
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于python中命名空間的三種方式介紹(附示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
python中的命名空間分三種:
內(nèi)置的命名空間,在啟動(dòng)解釋器的時(shí)候自動(dòng)加載進(jìn)內(nèi)存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字
全局命名空間,就是從上到下所有我們定義的變量名和函數(shù)名所在的空間,是在程序從上到下被執(zhí)行的過(guò)程中加載進(jìn)內(nèi)存的。
局部命名空間,比如函數(shù)在執(zhí)行時(shí)所開辟的空間,里面存放了函數(shù)內(nèi)部定義的各種名字,隨著函數(shù)執(zhí)行結(jié)束 這個(gè)局部命名空間就消失了。
在局部命名空間可以使用全局和內(nèi)置命名空間中的名字
在全局命名空間可以使用內(nèi)置命名空間中的名字,但不能使用局部命名空間的。
在內(nèi)置命名空間不能使用全局和局部的名字。
可以形象地理解成內(nèi)置命名空間具有最高級(jí)別,不需要定義就可以使用,全局命名空間次之,最低級(jí)是局部命名空間。
當(dāng)?shù)图?jí)命名空間使用名字時(shí)首先會(huì)在自身的命名空間里查找,如果有就使用,沒(méi)有的話就到上一級(jí)命名空間內(nèi)查找,如果有就使用,沒(méi)有就繼續(xù)到更上一級(jí)空間內(nèi)查找,直到頂層的內(nèi)置命名空間,如果有就使用,沒(méi)有則會(huì)報(bào)錯(cuò)。
舉個(gè)例子如下:num = 1 #這是全局命名空間內(nèi)定義的num = 1
def func1(): #這個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)局部命名空間1
num = 2 #這是在局部命名空間1定義的num = 2
def func2(): #這個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)局部命名空間2
num = 3 #這是在局部命名空間2 內(nèi) 定義的num = 3
print(num) #這是在局部命名空間2內(nèi) 使用num 變量
func2() # 調(diào)用函數(shù)func2時(shí) 會(huì)執(zhí)行該命令創(chuàng)建局部命名空間2
func1() #調(diào)用函數(shù)func1時(shí)會(huì)創(chuàng)建局部命名空間1,
#這幾個(gè)命名空間的級(jí)別順序是:內(nèi)置>全局>局部1>局部2
#當(dāng)print(num)指令執(zhí)行時(shí)它會(huì)在局部2內(nèi)查找是否有num,發(fā)現(xiàn)有則直接引用,如果沒(méi)有則會(huì)到上一級(jí)(局部1)中查找,局部1沒(méi)有則繼續(xù)到上一級(jí)(全局)查找
再看一個(gè)例子:#max()函數(shù)是內(nèi)置的函數(shù),如果我們?cè)谌置臻g中定義了函數(shù)名為max的函數(shù)時(shí),則該函數(shù)就失效了,也就是說(shuō)在自身空間內(nèi)找到了max()后就不去內(nèi)置命名空間查找了
def max(a,b,c):
return 'max失效了?'
print(max(1,2,3))#
正常情況下應(yīng)該輸出3(max函數(shù)功能是返回最大值),但是因?yàn)槲覀儼裮ax這個(gè)名字占用了,所以當(dāng)使用時(shí)程序就不去上一級(jí)空間(內(nèi)置命名空間)去查找了
與命名空間有關(guān)的兩個(gè)函數(shù)globals()和locals()
可以用globals()查看全局命名空間的所有定義的名字
可以用locals()查看當(dāng)前命名空間的所有定義的名字,在全局則返回全局,在局部則返回局部
這兩個(gè)函數(shù)的返回值可以看作是字典,格式都是{key1:value1,key2:value2,.....}
當(dāng)函數(shù)1內(nèi)嵌套函數(shù)2時(shí),對(duì)于函數(shù)1內(nèi)的不可變數(shù)據(jù)類型的變量,函數(shù)2內(nèi)可以引用,但不可修改def func1():
a = 1
def func2():
a = a + 1
#此處會(huì)報(bào)一個(gè)嚴(yán)重錯(cuò)誤,因?yàn)閍同時(shí)出現(xiàn)在等號(hào)兩邊,Python會(huì)先執(zhí)行等號(hào)右邊的表達(dá)式,
#發(fā)現(xiàn)你在引用a,然后它會(huì)先在本空間查找a,結(jié)果找到了等號(hào)左邊的a,其結(jié)果就是“在定義變量前引用變量”
pass
func2()
func1()#如果想要修改,可以使用nonlocal(python3中新增)
def func1():
a = 1
def func2():
nonlocal a
a = a + 1
func2()
print(a)
func1()
#我們可以看出,執(zhí)行func2()后再輸出a,a已經(jīng)變成2了
2
nonlocal只能作用于局部變量,當(dāng)使用后它會(huì)自動(dòng)查找上一級(jí)局部命名空間是否有該變量,如果沒(méi)有繼續(xù)向上查找,直到最上一級(jí)“局部命名空間”
以上就是python中命名空間的三種方式介紹(附示例)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
本文轉(zhuǎn)載于:segmentfault思否,如有侵犯,請(qǐng)聯(lián)系a@php.cn刪除
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的python的命名空间_python中命名空间的三种方式介绍(附示例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏角色坐标的保存间隔_使用C++编写飞
- 下一篇: python解释器调用_python入门