版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Python函數(shù)命名空間,作用域LEGB及Global詳析目錄一、命名空間和作用域1.1定義1.2內(nèi)建命名空間和內(nèi)建作用域1.3全局命名空間和全局作用域1.3局部命名空間和局部作用域1.4總結(jié)1.5擴(kuò)展LEGB二、Global關(guān)鍵字的使用說明
一、命名空間和作用域
當(dāng)出現(xiàn)了函數(shù),變量聲明的位置就發(fā)生了變化,不同位置聲明的變量,能訪問這個變量的范圍也出現(xiàn)了限制
1.1定義
**命名空間:**聲明定義了變量,變量存在的范圍,主要是通過命名空間,來區(qū)分不同范圍中聲明的變量。作用域:一個數(shù)據(jù)能夠作用的范圍
命名空間根據(jù)范圍的不同,分為以下幾種類型:
1.2內(nèi)建命名空間和內(nèi)建作用域
Python程序中最大的一個命名空間,通常在解釋器運(yùn)行目標(biāo)代碼的時候(也就是點(diǎn)RUN的時候),由解釋器創(chuàng)建的一個命名空間,負(fù)責(zé)初始化(即第一次賦值、第一次創(chuàng)建)系統(tǒng)環(huán)境變量。如:int/type()等
內(nèi)建命名空間加載時間:運(yùn)行代碼之前,通過解釋器加載好系統(tǒng)的命名空間。包含了int/float/str/type()等等各種數(shù)據(jù)類型或者函數(shù),所以我們在代碼中才可以直接使用這些數(shù)據(jù)類型或者函數(shù)作用:初始化系統(tǒng)環(huán)境變量作用域:內(nèi)建作用域(Builtin),此空間內(nèi)的數(shù)據(jù)作用范圍是整個內(nèi)建空間,包括子空間查看方式:dir()
1.3全局命名空間和全局作用域
定義:編寫Python代碼時,創(chuàng)建一個python文件,其中聲明在函數(shù)外部的變量,稱為:全局變量(global)。當(dāng)前可以聲明全局變量的所有位置稱為全局命名空間
加載時間:解釋器運(yùn)行目標(biāo)代碼時,加載全局命名空間,初始化該命名空間中的所有全局變量作用:聲明、定義全局變量的范圍作用域:全局作用(Global)查看方式:globals()查看當(dāng)前全局命名空間中的所有全局變量,本質(zhì)上globals()就是一個存儲了數(shù)據(jù)的字典,
例如:
name="張三"
age=12
grade=["1",2,"3"]
defouter():
a="a"
definner():
a="b"
returninner
fun=outer()
fun()
print(f"全局變量字典為:{globals()}")
運(yùn)行結(jié)果:
1.3局部命名空間和局部作用域
定義:當(dāng)Python文件中聲明函數(shù)時,獨(dú)立出來了一個小的作用范圍(函數(shù)內(nèi)部),通常情況下我們將函數(shù)內(nèi)部的空間稱為:局部命名空間
加載時間:解釋器運(yùn)行目標(biāo)代碼時,加載完全局命名空間之后,加載局部命名空間,初始化局部命名空間中的局部變量
注意:如果是嵌套函數(shù),嵌套函數(shù)是沒有命名空間的,嵌套函數(shù)的空間存于父函數(shù)內(nèi),但嵌套函數(shù)是有其自己的作用域的,叫嵌套作用域(內(nèi)部作用域)
作用:聲明、定義局部變量作用域:局部作用域(嵌套作用域)查看方式:Locals()查看當(dāng)前命名空間中的所有數(shù)據(jù)
Locals():查看當(dāng)前命名空間中的數(shù)據(jù)
編寫在函數(shù)內(nèi)部:查看局部命名空間中的數(shù)據(jù)編寫在函數(shù)外部:和globals()一樣的意義
示例:
name="張三"
age=12
grade=["1",2,"3"]
defouter():
a="a"
print(f"outer局部的數(shù)據(jù):{locals()}")
definner():
a="b"
print(f"inner局部的數(shù)據(jù):{locals()}")
returninner
fun=outer()
fun()
print(f"全局變量字典為:{globals()}")
print(f"全局部的數(shù)據(jù):{locals()}")
運(yùn)行結(jié)果:
1.4總結(jié)
命名空間是一個名詞,表示了一個可以聲明變量的范圍用作域是一個動詞,表示一個變量起作用的范圍解釋器運(yùn)行時,命名空間的加載順序:內(nèi)建命名空間全局命名空間局部命名空間查詢使用變量,查詢使用順序:內(nèi)部作用域嵌套作用域全局作用域內(nèi)建作用域,也就是Python常說的LEGB原則。查找順序通俗的說就是:就近原則,一直找到內(nèi)建作用域,找不到報:nameisnotdefined
1.5擴(kuò)展LEGB
Local,本地作用域,局部作用域的local命名空間。函數(shù)調(diào)用時創(chuàng)建,調(diào)用結(jié)束消亡Enclosing,Python2.2時引入嵌套函數(shù),實(shí)現(xiàn)了閉包,這個就是嵌套函數(shù)的外部函數(shù)的命名空間Global,全局作用域,即一個模塊的命名空間。模塊被import時創(chuàng)建,解釋器退出時消亡Build-in,內(nèi)置模塊的命名空間,生命周期從python解釋器啟動時創(chuàng)建到解釋器退出時消亡,例如:print(open),print和open都是的變量
二、Global關(guān)鍵字的使用說明
在講述什么是Global之前,讓我們先來看一個例子,以下例子兩條print語句分別打印什么:
x=100
deffn1():
x+=1
print(f"函數(shù)內(nèi)的{x}")
fn1()
print(f"變更后的{x}")
運(yùn)行結(jié)果:
為什么會運(yùn)行報錯:X在使用前需要先分配變量值,明明我們在全局已經(jīng)定義了一個X=100
原因:在python動態(tài)語言內(nèi),==賦值即定義==,在inner內(nèi)部
x+=1其實(shí)是一個x=x+1的賦值語句,那這個x就會函數(shù)運(yùn)行在初始化進(jìn)行加載,變成局部的一個變量而=運(yùn)算時,從左往右執(zhí)行,在x=的時候已經(jīng)默許了x是localvariable,因此外部作用域的x=100是被屏蔽的。所以x+1中的x相當(dāng)于一個沒有賦值的變量,從而報錯。
那么怎么解決這個問題?解決的辦法一:使用global關(guān)建字將x定義為全局變量,這時在函數(shù)局部就會將x指向全局的變量x
讓我們來看看具體的應(yīng)用,下面的代碼運(yùn)行結(jié)果如何:
x=100
deffn1():
x=10
globalx
x+=1
print(f"函數(shù)內(nèi)的{x}")
fn1()
print(f"變更后的{x}")
運(yùn)行結(jié)果:
為什么還是報錯,我們不是已經(jīng)使用了global嗎?那是因?yàn)槲覀兦懊媛暶髑凹恿艘痪洌簒=10
x=10時會將其置為局部變量,但程序執(zhí)行到globalx時,發(fā)現(xiàn)x已經(jīng)在局部定義過了,所以報錯,所以我們要先聲明再調(diào)用
所以我們將程序調(diào)整為:
那么問題又來了,下面的例子,globalx在inner函數(shù)內(nèi)可以調(diào)用嗎?
x=100
defouter():
globalx
x+=1
print(f"ouer的x調(diào)用結(jié)果{x}")
definner():
x+=1
print(f"inner的x調(diào)用結(jié)果{x}")
returninner
a=outer()
a()
運(yùn)行結(jié)果:
為什么報錯,不是已經(jīng)定義了global全局變量,同時也是局部作用域內(nèi)先定義了嗎?
原因:Global定義只在全局和定義的當(dāng)前作用域內(nèi)起作用,所以上面的例子,globalx只在全局作用域和嵌
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠色施工管理信息系統(tǒng)方案
- 城中村社區(qū)志愿者管理方案
- 城中村外部環(huán)境整治方案
- 裝修施工人員培訓(xùn)方案
- 零排放工業(yè)園區(qū)建設(shè)方案
- 可持續(xù)交通系統(tǒng)建設(shè)方案
- 2026年生物信息學(xué)與基因組數(shù)據(jù)分析題目
- 2026年計(jì)算機(jī)等級考試編程語言實(shí)踐題
- 2026年電氣工程專業(yè)知識技能考核題集
- 跨文化交流能力提升語言與溝通模擬題庫2026年
- 保育員配合教學(xué)培訓(xùn)工作指南
- 華為公司獎罰管理制度
- 2026年安全員之A證考試題庫500道附答案(典型題)
- 2025-2030衛(wèi)星互聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展趨勢與戰(zhàn)略布局分析報告
- T-CACM 1637-2025 中醫(yī)證候療效評價技術(shù)規(guī)范
- 2025年日語能力測試N4級真題模擬備考試卷
- DB62∕T 4203-2020 云杉屬種質(zhì)資源異地保存庫營建技術(shù)規(guī)程
- 年終歲末的安全培訓(xùn)課件
- 中醫(yī)康復(fù)面試題目及答案
- 《人工智能導(dǎo)論》高職人工智能通識課程全套教學(xué)課件
- 中華醫(yī)學(xué)會麻醉學(xué)分會困難氣道管理指南
評論
0/150
提交評論