摘要:在內(nèi)置命名空間不能使用全局和局部的名字??梢孕蜗蟮乩斫獬蓛?nèi)置命名空間具有最高級(jí)別,不需要定義就可以使用,全局命名空間次之,最低級(jí)是局部命名空間。
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了 2nonlocal只能作用于局部變量,當(dāng)使用后它會(huì)自動(dòng)查找上一級(jí)局部命名空間是否有該變量,如果沒(méi)有繼續(xù)向上查找,直到最上一級(jí)“局部命名空間”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42576.html
摘要:我們說(shuō)觸發(fā)了閉包的函數(shù)叫做閉包函數(shù)閉包最大的特點(diǎn)就是它可以被外層函數(shù)返回后賦值給一個(gè)變量,并且攜帶了外層函數(shù)內(nèi)定義的變量例子如下變量為函數(shù)開辟的局部命名空間內(nèi)定義的變量函數(shù)內(nèi)引用了變量的內(nèi)層函數(shù)名被當(dāng)作返回值,此時(shí)閉包規(guī)則達(dá)成。 什么是閉包? 其實(shí)我們?cè)谑褂煤瘮?shù)過(guò)程中不經(jīng)意間就會(huì)觸發(fā)閉包,因?yàn)榭倳?huì)出于某種原因會(huì)在函數(shù)內(nèi)引用或修改上一層函數(shù)的變量,這時(shí)就會(huì)觸發(fā)閉包 那么什么是閉包?其實(shí)就...
摘要:事實(shí)上語(yǔ)言當(dāng)中有的內(nèi)容,比如函數(shù)循環(huán)結(jié)構(gòu)體宏等等內(nèi)容,也都有,所以大家千萬(wàn)不要認(rèn)為語(yǔ)言白學(xué)了哈因?yàn)橹耙呀?jīng)完整更新過(guò)語(yǔ)言的博客有需要可以往前翻,所以這里直接介紹相對(duì)語(yǔ)言當(dāng)中新增的內(nèi)容,而本章引入的內(nèi)容是的關(guān)鍵字命名空間缺省參數(shù)函數(shù)重載。 ...
摘要:定義函數(shù)中的函數(shù)使用關(guān)鍵字定義,格式為函數(shù)名形參函數(shù)語(yǔ)句塊函數(shù)名只能包含字符串下劃線和數(shù)字且不能以數(shù)字開頭。所以默認(rèn)參數(shù)還是放在后面合適。 定義函數(shù) python中的函數(shù)使用關(guān)鍵字 def 定義,格式為: def 函數(shù)名(形參): 函數(shù)語(yǔ)句塊 函數(shù)名只能包含字符串、下劃線和數(shù)字且不能以數(shù)字開頭。函數(shù)的形參分為:位置參數(shù)、默認(rèn)參數(shù)(自帶默認(rèn)值的參數(shù))、動(dòng)態(tài)參數(shù)return是關(guān)鍵字...
摘要:在大型的工程中,自己定義的變量函數(shù),類名與其他人定義的相沖突等問(wèn)題。使用標(biāo)準(zhǔn)輸出控制臺(tái)和標(biāo)準(zhǔn)輸入鍵盤時(shí),必須包含頭文件以及標(biāo)準(zhǔn)命名空間。缺省參數(shù)概念缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。 目錄 前言 1.命名空間 1.1命名空間定義 1.2 命名空間使用 2. C++的輸入和...
摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒(méi)有任何關(guān)系。作用域作用域,是一個(gè)命名空間可直接發(fā)放完的代碼的文本區(qū)域。刪除也是如此,語(yǔ)句會(huì)從局部命名空間的引用中移除對(duì)的綁定。 命名空間和作用域的概念我們之前也提到過(guò),比如內(nèi)置函數(shù)globals(),函數(shù)中變量的作用域,模塊使用的import等等。這些可能讓我們對(duì)這兩個(gè)概念有了大致的理解。本節(jié)再詳細(xì)探討一下。 showImg(h...
閱讀 2470·2021-10-09 09:44
閱讀 2207·2021-10-08 10:05
閱讀 3486·2021-07-26 23:38
閱讀 3088·2019-08-28 18:16
閱讀 880·2019-08-26 11:55
閱讀 1896·2019-08-23 18:29
閱讀 2119·2019-08-23 18:05
閱讀 1409·2019-08-23 17:02