Python函數(shù)命名空間,作用域LEGB及Global詳析_第1頁
Python函數(shù)命名空間,作用域LEGB及Global詳析_第2頁
Python函數(shù)命名空間,作用域LEGB及Global詳析_第3頁
Python函數(shù)命名空間,作用域LEGB及Global詳析_第4頁
Python函數(shù)命名空間,作用域LEGB及Global詳析_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論