Python命名空間namespace及作用域原理解析
曾經(jīng)學(xué)C++的時(shí)候,經(jīng)常聽到這個(gè)名詞,它主要是為了避免命名沖突而產(chǎn)生的。
就像有A(4個(gè)蘋果),B(6個(gè)蘋果)兩個(gè)人,10個(gè)蘋果,如果只標(biāo)簽了蘋果,你無法判斷哪個(gè)蘋果是屬于哪個(gè)人的,因?yàn)闃?biāo)簽都是一樣的;但是如果標(biāo)簽是A.蘋果,B.蘋果,那么是不是很容易就知道了蘋果是誰的了。
命名空間:提供了一種從名稱到對(duì)象的映射;主要是通過字典來實(shí)現(xiàn)的。
在python中,函數(shù)、模塊等都有自己的命名空間:
局部命名空間(local namespace):即函數(shù)中定義的名稱 —— 包括函數(shù)中的變量、參數(shù)、局部變量等;
全局命名空間(global namespace):即模塊中定義的名稱 —— 包括模塊中的變量、函數(shù)、類、參數(shù)、常量、導(dǎo)入(import)的模塊等;
內(nèi)置命名空間(built-in namespace):即python內(nèi)置的名稱 —— 包括各種內(nèi)置函數(shù)、Exception等;
而,當(dāng)python需要使用變量時(shí),會(huì)在上述命名空間中依次查找,順序是:
局部命名空間,全局命名空間、內(nèi)置命名空間。
同一命名空間中不能有重名,但不同命名空間可以。
可以通過locals()、globals() 函數(shù)來獲取命名空間的值(字典),在程序的不同位置執(zhí)行結(jié)果不一定一致,因?yàn)榻Y(jié)果是針對(duì)當(dāng)前位置來說的。
locals()
globals()
可以通過字典形式獲取其中的值:
作用域:可以理解為變量所起作用的范圍,超出范圍則某變量不能被使用。在python 程序中,直接訪問一個(gè)變量,會(huì)從內(nèi)到外依次訪問所有的作用域直到找到,否則報(bào)錯(cuò)。Python 中只有模塊(module),類(class)以及函數(shù)(def、lambda)才會(huì)產(chǎn)生新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會(huì)產(chǎn)生新的作用域的。
作用域可以分為四種:
Local:最內(nèi)層,包含局部變量,一般指的是函數(shù)內(nèi)部的作用域;
Enclosing:包含非局部但是也不是全局的變量,主要是嵌套時(shí),外層函數(shù)的變量,那么相對(duì)內(nèi)層函數(shù)來說,嵌套的外層函數(shù)中的變量既不是局部變量也不是全局變量。
Global:全局變量,例如當(dāng)前模塊中的全局變量。
Build-in:內(nèi)置變量。
查找順序一般是:Local--->Enclosing--->Global--->Build-in
def test1(): x1 = 1 #Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) x1 = 100 #很明顯,外層作用域中的x1沒有受到影響,因?yàn)檫@里的x1屬于Local test2() return x1 aa = test1() print('aa=',aa)
要想修改外層作用域(上層)的變量,需要用到global和nonlocal關(guān)鍵字。(注意,修改和訪問不是一樣的程度)
def test1(): x1 = 1 #Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) nonlocal x1 x1 = 100 #通過nonlocal,將這里的x1作用域變化為Enclosing作用域,即影響到Enclosing作用域中的x1的值 test2() return x1 aa = test1() print('aa=',aa)
def test1(): x1 = 1 # 這個(gè)x1屬于Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) global x1 # 這個(gè)x1屬于全局作用域 x1 = 100 #這里影響的是全局作用域中的x1值,并不會(huì)影響到Enclosing作用域中的值 test2() return x1 #返回的是當(dāng)前作用域Enclosing中的x1的值 aa = test1() print('aa=',aa) print('x1=',x1)
全局變量和局部變量
定義在函數(shù)內(nèi)部的變量,擁有局部作用域,屬于局部變量。
定義在函數(shù)外部的變量,擁有全局作用域,屬于全局變量。
全局變量可以在整個(gè)全局作用域內(nèi)訪問,但是要修改的話,需要用到global關(guān)鍵字。
更細(xì)節(jié)一點(diǎn),若涉及到class:
全局變量:一般在模塊內(nèi)、在所有函數(shù)外面、在class外面的變量。
局部變量:一般在函數(shù)內(nèi)、在class的方法內(nèi)(未加self修飾)的變量。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)關(guān)閉第三方窗口的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)關(guān)閉第三方窗口的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06python GUI庫圖形界面開發(fā)之PyQt5 MDI(多文檔窗口)QMidArea詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5 MDI(多文檔窗口)QMidArea詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Python實(shí)現(xiàn)打印彩色字符串的方法詳解
print?也許是我們?cè)谑褂?Python?的時(shí)候用的最多的一種操作,但是經(jīng)常發(fā)現(xiàn)很多人可以打印彩色文本,這種操作是怎么得到的呢?本文就來為大家詳細(xì)講講2022-08-08Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法
今天小編就為大家分享一篇Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python AutoCAD 系統(tǒng)設(shè)置的實(shí)現(xiàn)方法
這篇文章主要介紹了Python AutoCAD 系統(tǒng)設(shè)置的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python中byte字符串轉(zhuǎn)string的實(shí)現(xiàn)
本文主要介紹了Python中byte字符串轉(zhuǎn)string的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07