python 中的命名空間,你真的了解嗎?
寫(xiě)在之前
命名空間,又名 namesapce,是在很多的編程語(yǔ)言中都會(huì)出現(xiàn)的術(shù)語(yǔ),估計(jì)很多人都知道這個(gè)詞,但是讓你真的來(lái)說(shuō)這是個(gè)什么,估計(jì)就歇菜了,所以我覺(jué)得 “命名空間” 有必要了解一下。
全局變量 & 局部變量
全局變量和局部變量是我們理解命名空間的開(kāi)始,我們先來(lái)看一段代碼:
x = 2
def func():
x = 3
print('func x ---> ',x)
func()
print('out of func x ---> ',x)
這段代碼輸出的結(jié)果如下:
func x ---> 3
out of func x ---> 2
從上述的結(jié)果中可以看出,運(yùn)行 func(),輸出的是 func() 里面的變量 x 所引用的對(duì)象 3,之后執(zhí)行的是代碼中的最后一行。這里要區(qū)分清楚,前一個(gè) x 輸出的是函數(shù)內(nèi)部的變量 x,后一個(gè) x 輸出的是函數(shù)外的變量 x,兩個(gè)變量互相不影響,在各自的作用域中起作用。
那個(gè)只在函數(shù)內(nèi)起作用的變量就叫 “局部變量”,有了 “局部” 就有相應(yīng)的 “全部”,但是后者聽(tīng)起來(lái)有歧義,所以就叫了 “全局”。
x = 2
def func():
global x = 3 #注意此處
print('func x ---> ',x)
func()
print('out of func x ---> ',x)
這段代碼中比上段代碼多加了一個(gè) global x,這句話(huà)的意思是在聲明 x 是全局變量,通俗點(diǎn)說(shuō)就是這個(gè) x 和 函數(shù)外的 x 是同一個(gè)了,所以結(jié)果就成了下面這樣:
func x ---> 3
out of func x ---> 3
這樣乍一看好像全局變量好強(qiáng),可以管著函數(shù)內(nèi)外,但是我們還是要注意,全局變量還是謹(jǐn)慎使用的好,因?yàn)楫吘箖?nèi)外有別,不要帶來(lái)混亂。
作用域
作用域,用比較直白的方式來(lái)說(shuō),就是程序中變量與對(duì)象存在關(guān)聯(lián)的那段程序,比如我在上面說(shuō)的, x = 2 和 x = 3 是在兩個(gè)不同的作用域中。
通常的,作用域是被分為靜態(tài)作用域和動(dòng)態(tài)作用域,雖然我們說(shuō) Python 是動(dòng)態(tài)語(yǔ)言,但是它的作用域?qū)儆陟o態(tài)作用域,即 Python 中的變量的作用域是由該變量所在程序中的位置所決定的。
在 Python 中作用域被劃分成四個(gè)層級(jí),分別是:local(局部作用域),enclosing(嵌套作用域),global(全局作用域)和 built - in(內(nèi)建作用域)。對(duì)于一個(gè)變量,Python 也是按照之前四個(gè)層級(jí)依次在不用的作用域中查找,我們?cè)谏弦欢未a中,對(duì)于變量 x,首先搜索的是函數(shù)體內(nèi)的局部作用域,然后是函數(shù)體外的全局作用域,至于這段話(huà)具體怎么來(lái)理解,請(qǐng)看下面的例子:
def out_func():
x = 2
def in_func():
x = 3
print('in_func x ---> ',x)
in_func()
print('out_func x ---> ',x)
x = 4
out_func()
print('x == ',x)
仔細(xì)觀察一下上面的代碼和運(yùn)行的結(jié)果,你就會(huì)發(fā)現(xiàn)變量在不同的范圍內(nèi)進(jìn)行搜索的規(guī)律,是不是感覺(jué)這些都是以前被你忽略的呢?
命名空間
《維基百科》中說(shuō) “命名空間是對(duì)作用域的一種特殊的抽象”,在這里我用一個(gè)比方來(lái)具體說(shuō)明一下:
比如張三在公司 A,他的工號(hào)是 111,李四在公司 B,他的工號(hào)也是 111,因?yàn)閮蓚€(gè)人在不同的公司,他們倆的工號(hào)可以相同但是不會(huì)引起混亂,這里的公司就表示一個(gè)獨(dú)立的命名空間,如果兩個(gè)人在一個(gè)公司的話(huà),他們的工號(hào)就不能相同,否則光看工號(hào)也不知道到底是誰(shuí)。
其實(shí)上面舉的這個(gè)例子的特點(diǎn)就是我們使用命名空間的理由,在大型的計(jì)算機(jī)程序中,往往會(huì)出現(xiàn)成百上千的標(biāo)識(shí)符,命名空間提供隱藏區(qū)域標(biāo)識(shí)符的機(jī)制。通過(guò)將邏輯上相關(guān)的標(biāo)識(shí)符構(gòu)成響應(yīng)的命名空間,可以使整個(gè)系統(tǒng)更加的模塊化。
我在開(kāi)頭引用的《維基百科》的那句話(huà)說(shuō) “命名空間是對(duì)作用域的一種特殊的抽象”,它其實(shí)包含了處于該作用域內(nèi)的標(biāo)識(shí)符,且它本身也用一個(gè)標(biāo)識(shí)符來(lái)表示。在 Python 中,命名空間本身的標(biāo)識(shí)符也屬于更外層的一個(gè)命名空間,所以命名空間也是可以嵌套的,它們共同生活在 “全局命名空間” 下。
簡(jiǎn)言之,不同的命名空間可以同時(shí)存在,但是彼此獨(dú)立,互不干擾。當(dāng)然了,命名空間因?yàn)槠鋵?duì)象的不同也有所區(qū)別,可以分為以下幾種:
1.本地命名空間:模塊中有函數(shù)或者類(lèi)的時(shí)候,每個(gè)函數(shù)或者類(lèi)所定義的命名空間即是本地命名空間,當(dāng)函數(shù)返回結(jié)果或者拋出異常的時(shí)候,本地命名空間也就結(jié)束了。
2.全局命名空間:每個(gè)模塊創(chuàng)建了自己所擁有的全局命名空間,不同模塊的全局命名空間彼此獨(dú)立,不同模塊中相同名稱(chēng)的命名空間也會(huì)因?yàn)槟K的不同而不相互干擾。
3.內(nèi)置命名空間:當(dāng) Python 運(yùn)行起來(lái)的時(shí)候,它們就存在了,內(nèi)置函數(shù)的命名空間都屬于內(nèi)置命名空間,所以我們可以在任何程序中直接運(yùn)行它們。
程序查詢(xún)命名空間的時(shí)候也有一套順序,依次按照本地命名空間 ,全局命名空間,內(nèi)置命名空間。
def fun(like):
name = 'rocky'
print(locals())
fun('python')
訪問(wèn)本地命名空間使用 locals 完成,我們來(lái)看一下結(jié)果:
{'name': 'rocky', 'like': 'python'}
從上面的結(jié)果中可以看出,命名空間中的數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)和字典是一樣的。可能你已經(jīng)猜到了,當(dāng)我們要訪問(wèn)全局命名空間的時(shí)候,可以使用 globals。
關(guān)于命名空間還有一個(gè)生命周期的問(wèn)題,就是一個(gè)命名空間什么時(shí)候出現(xiàn),什么時(shí)候消失,這個(gè)很好理解,就是哪部分被讀入內(nèi)存,哪部分的命名空間就存在了,比如我們?cè)谏厦嬲f(shuō)的,Python 啟動(dòng),內(nèi)置命名空間就建立。
寫(xiě)在之后
至此,我的零基礎(chǔ)學(xué)習(xí) Python 計(jì)劃里關(guān)于函數(shù)的部分就結(jié)束了,這一部分寫(xiě)的時(shí)間超出了我原本的計(jì)劃,但是在寫(xiě)的過(guò)程中覺(jué)得有些知識(shí)點(diǎn)還是說(shuō)說(shuō)的好,從下周開(kāi)始,就要開(kāi)始 “類(lèi)” 這一部分的學(xué)習(xí)啦,希望我們還可以繼續(xù)這么走下去,我堅(jiān)持寫(xiě),你也堅(jiān)持學(xué)。
還有堅(jiān)持。。點(diǎn)個(gè)贊。。
以上就是python 中的命名空間,你真的了解嗎?的詳細(xì)內(nèi)容,更多關(guān)于python 命名空間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于wxpython開(kāi)發(fā)的簡(jiǎn)單gui計(jì)算器實(shí)例
這篇文章主要介紹了基于wxpython開(kāi)發(fā)的簡(jiǎn)單gui計(jì)算器,實(shí)例分析了基于wxpython實(shí)現(xiàn)簡(jiǎn)單桌面應(yīng)用程序的相關(guān)技巧,需要的朋友可以參考下2015-05-05
python實(shí)現(xiàn)三次密碼驗(yàn)證的示例
這篇文章主要介紹了python實(shí)現(xiàn)三次密碼驗(yàn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
Python辦公自動(dòng)化之CSV文件的運(yùn)用和管理
Python辦公?動(dòng)化是利?Python編程語(yǔ)?來(lái)創(chuàng)建腳本和程序,以簡(jiǎn)化、加速和?動(dòng)化?常辦公任務(wù)和?作流程的過(guò)程,本文主要來(lái)介紹一下如何利用Python進(jìn)行CSV文件的運(yùn)用和管理,感興趣的可以了解下2023-12-12
Python劃分?jǐn)?shù)組為連續(xù)數(shù)字集合的練習(xí)
這篇文章主要給大家分享的是Python劃分?jǐn)?shù)組為連續(xù)數(shù)字集合的練習(xí),下面文章首先對(duì)問(wèn)題進(jìn)行詳細(xì)描述,在根據(jù)問(wèn)題提出解決方案,內(nèi)容詳細(xì),需要的朋友可以參考一下,希望對(duì)你有所幫助2021-11-11
NumPy統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了NumPy統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Python類(lèi)的基本寫(xiě)法與注釋風(fēng)格介紹
這篇文章主要介紹了Python類(lèi)的基本寫(xiě)法與注釋風(fēng)格,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Python腳本實(shí)現(xiàn)自動(dòng)將數(shù)據(jù)庫(kù)備份到 Dropbox
本文給大家分享的是作者使用python腳本實(shí)現(xiàn)自動(dòng)備份mysql數(shù)據(jù)庫(kù)到的dropbox網(wǎng)盤(pán)的代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2017-02-02

