詳解Python?中的命名空間、變量和范圍
Python 中的命名空間、變量和范圍
什么是命名空間?
首先,我們需要感知python中的名稱(chēng)(標(biāo)識(shí)符)是什么。眾所周知,在python中,一切都是對(duì)象。名稱(chēng)幫助我們?cè)L問(wèn)底層對(duì)象。例如,當(dāng)我們做作業(yè)時(shí) a = 1
, 1
是存儲(chǔ)在內(nèi)存中的對(duì)象,a 是我們與之關(guān)聯(lián)的名稱(chēng)。我們可以通過(guò)內(nèi)置函數(shù)獲取某個(gè)對(duì)象的地址(在 RAM 中), ID()
.讓我們看看如何使用它。
a = 1 打?。?id(1)=',id(1)) 打?。?id(a)=',id(a)) 輸出: id(1) = 9801248 id(a) = 9801248
在這里,兩者都指同一個(gè)對(duì)象 1
,所以他們擁有相同的id。
現(xiàn)在我們知道了名稱(chēng)是什么,我們可以繼續(xù)討論名稱(chēng)空間的概念。簡(jiǎn)單地說(shuō),命名空間是名稱(chēng)的集合。在 Python 中,您可以將命名空間想象為您定義的每個(gè)名稱(chēng)到相應(yīng)對(duì)象的映射。不同的命名空間可以在給定時(shí)間共存,但完全隔離。當(dāng)我們啟動(dòng) Python 解釋器時(shí),會(huì)創(chuàng)建一個(gè)包含所有內(nèi)置名稱(chēng)的命名空間,并且只要解釋器??運(yùn)行,它就存在。這就是內(nèi)置函數(shù)像 ID()
, 打?。ǎ?/code> 我們始終可以從程序的任何部分獲得等。每個(gè)模塊創(chuàng)建自己的全局命名空間。這些不同的命名空間是隔離的。因此,不同模塊中可能存在的相同名稱(chēng)不會(huì)發(fā)生沖突。
變量和表達(dá)式
要將現(xiàn)實(shí)世界的問(wèn)題轉(zhuǎn)化為可以通過(guò)算法解決的問(wèn)題,有兩個(gè)相互關(guān)聯(lián)的任務(wù)。首先,選擇變量,其次,找到與這些變量相關(guān)的表達(dá)式。變量是附加在對(duì)象上的標(biāo)簽;它們不是對(duì)象本身。它們也不是對(duì)象的容器。變量不包含對(duì)象,而是充當(dāng)對(duì)象的指針或引用。例如,考慮以下代碼:
在這里,我們創(chuàng)建了一個(gè)變量 a,它指向一個(gè)列表對(duì)象。我們創(chuàng)建另一個(gè)變量 b,它指向同一個(gè)列表對(duì)象。當(dāng)我們向這個(gè)列表對(duì)象追加一個(gè)元素時(shí),這種變化會(huì)同時(shí)反映在 a 和 b 中。
Python 是一種動(dòng)態(tài)類(lèi)型語(yǔ)言。在程序執(zhí)行期間,變量名可以綁定到不同的值和類(lèi)型。例如,每個(gè)值都是類(lèi)型、字符串或整數(shù);但是,指向該值的名稱(chēng)沒(méi)有特定類(lèi)型。這與許多語(yǔ)言(例如 C 和 Java)不同,其中名稱(chēng)表示內(nèi)存中的固定大小、類(lèi)型和位置。這意味著當(dāng)我們?cè)?Python 中初始化變量時(shí),我們不需要聲明類(lèi)型。此外,變量,或者更具體地說(shuō)是它們指向的對(duì)象,可以根據(jù)分配給它們的值更改類(lèi)型,例如:
變量范圍
了解函數(shù)內(nèi)部變量的作用域規(guī)則很重要。每次執(zhí)行函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的本地命名空間。這表示一個(gè)本地環(huán)境,其中包含由函數(shù)分配的參數(shù)和變量的名稱(chēng)。為了在調(diào)用函數(shù)時(shí)解析命名空間,Python 解釋器首先搜索本地命名空間(即函數(shù)本身),如果未找到匹配項(xiàng),則搜索全局命名空間。這個(gè)全局命名空間是定義函數(shù)的模塊。如果仍未找到該名稱(chēng),它將搜索內(nèi)置命名空間。最后,如果失敗,則解釋器會(huì)引發(fā) NameError 異常??紤]以下代碼:
在示例中,定義了兩個(gè)全局變量。我們需要使用關(guān)鍵字 global 告訴解釋器,在函數(shù)內(nèi)部,我們指的是一個(gè)全局變量。當(dāng)我們將此變量更改為 11 時(shí),這些更改會(huì)反映在全局范圍內(nèi)。但是,我們?cè)O(shè)置為 21 的變量 b 是函數(shù)的局部變量,函數(shù)內(nèi)部對(duì)其所做的任何更改都不會(huì)反映在全局范圍內(nèi)。當(dāng)我們運(yùn)行函數(shù)并打印 b 時(shí),我們看到它保留了它的全局值。
到此這篇關(guān)于Python 中的命名空間、變量和范圍的文章就介紹到這了,更多相關(guān)Python命名空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談keras的深度模型訓(xùn)練過(guò)程及結(jié)果記錄方式
今天小編就為大家分享一篇淺談keras的深度模型訓(xùn)練過(guò)程及結(jié)果記錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01如何基于Python和Flask編寫(xiě)Prometheus監(jiān)控
這篇文章主要介紹了如何基于Python和Flask編寫(xiě)Prometheus監(jiān)控,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11python?中?lxml?的?etree?標(biāo)簽解析
這篇文章主要介紹了python?中l(wèi)xml的etree?標(biāo)簽解析,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助2022-04-04Python實(shí)現(xiàn)簡(jiǎn)易五子棋游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Anaconda3中的Jupyter notebook添加目錄插件的實(shí)現(xiàn)
這篇文章主要介紹了Anaconda3中的Jupyter notebook添加目錄插件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Pytorch基礎(chǔ)教程之torchserve模型部署解析
torchserve是基于netty網(wǎng)絡(luò)框架實(shí)現(xiàn)的,底層使用EpollServerSocketChannel服務(wù)進(jìn)行網(wǎng)絡(luò)通信,通過(guò)epoll多路復(fù)用技術(shù)實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)連接處理,這篇文章主要介紹了Pytorch基礎(chǔ)教程之torchserve模型部署和推理,需要的朋友可以參考下2023-07-07