最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python函數(shù)命名空間,作用域LEGB及Global詳析

 更新時(shí)間:2022年09月08日 11:59:32   作者:測試工程師Jane  
這篇文章主要介紹了Python函數(shù)命名空間,作用域LEGB及Global詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

一、命名空間和作用域

當(dāng)出現(xiàn)了函數(shù),變量聲明的位置就發(fā)生了變化,不同位置聲明的變量,能訪問這個(gè)變量的范圍也出現(xiàn)了限制

1.1 定義

**命名空間:**聲明定義了變量,變量存在的范圍,主要是通過命名空間,來區(qū)分不同范圍中聲明的變量。作用域: 一個(gè)數(shù)據(jù)能夠作用的范圍

命名空間根據(jù)范圍的不同,分為以下幾種類型:

1.2 內(nèi)建命名空間和內(nèi)建作用域

Python程序中最大的一個(gè)命名空間,通常在解釋器運(yùn)行目標(biāo)代碼的時(shí)候(也就是點(diǎn)RUN的時(shí)候),由解釋器創(chuàng)建的一個(gè)命名空間,負(fù)責(zé)初始化(即第一次賦值、第一次創(chuàng)建)系統(tǒng)環(huán)境變量。如:int/type()等

  • 內(nèi)建命名空間加載時(shí)間:運(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ù)作用范圍是整個(gè)內(nèi)建空間,包括子空間
  • 查看方式:dir()

1.3 全局命名空間和全局作用域

定義: 編寫Python代碼時(shí),創(chuàng)建一個(gè)python文件,其中聲明在函數(shù)外部的變量,稱為:全局變量(global)。當(dāng)前可以聲明全局變量的所有位置稱為全局命名空間

加載時(shí)間:解釋器運(yùn)行目標(biāo)代碼時(shí),加載全局命名空間,初始化該命名空間中的所有全局變量作用:聲明、定義全局變量的范圍作用域:全局作用(Global)查看方式:globals()查看當(dāng)前全局命名空間中的所有全局變量,本質(zhì)上globals()就是一個(gè)存儲了數(shù)據(jù)的字典,

例如:

name = "張三"
age = 12
grade = ["1",2,"3"]
def outer():
    a = "a"
    def inner():
        a = "b"
    return inner
fun = outer()
fun()
print(f"全局變量字典為:{globals()}")

運(yùn)行結(jié)果:

1.3 局部命名空間和局部作用域

定義:當(dāng)Python文件中聲明函數(shù)時(shí),獨(dú)立出來了一個(gè)小的作用范圍(函數(shù)內(nèi)部),通常情況下我們將函數(shù)內(nèi)部的空間稱為:局部命名空間

加載時(shí)間:解釋器運(yùn)行目標(biāo)代碼時(shí),加載完全局命名空間之后,加載局部命名空間,初始化局部命名空間中的局部變量

注意:如果是嵌套函數(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"]
def outer():
    a = "a"
    print(f"outer局部的數(shù)據(jù):{locals()}")
    def inner():
        a = "b"
        print(f"inner局部的數(shù)據(jù):{locals()}")
    return inner

fun = outer()
fun()
print(f"全局變量字典為:{globals()}")
print(f"全局部的數(shù)據(jù):{locals()}")

運(yùn)行結(jié)果:

1.4 總結(jié)

  • 命名空間是一個(gè)名詞, 表示了一個(gè)可以聲明變量的范圍
  • 用作域是一個(gè)動詞,表示一個(gè)變量起作用的范圍
  • 解釋器運(yùn)行時(shí),命名空間的加載順序:內(nèi)建命名空間–>全局命名空間–>局部命名空間
  • 查詢使用變量,查詢使用順序:內(nèi)部作用域–>嵌套作用域–>全局作用域–>內(nèi)建作用域,也就是Python常說的LEGB原則。查找順序通俗的說就是:就近原則,一直找到內(nèi)建作用域,找不到報(bào):“name is not defined”

1.5 擴(kuò)展LEGB

  • Local,本地作用域,局部作用域的local命名空間。函數(shù)調(diào)用時(shí)創(chuàng)建,調(diào)用結(jié)束消亡
  • Enclosing,Python2.2時(shí)引入嵌套函數(shù),實(shí)現(xiàn)了閉包,這個(gè)就是嵌套函數(shù)的外部函數(shù)的命名空間
  • Global,全局作用域,即一個(gè)模塊的命名空間。模塊被import時(shí)創(chuàng)建 ,解釋器退出時(shí)消亡
  • Build-in,內(nèi)置模塊的命名空間,生命周期從python解釋器啟動時(shí)創(chuàng)建到解釋器退出時(shí)消亡,例如:print(open),print和open都是的變量

二、Global關(guān)鍵字的使用說明

在講述什么是Global之前,讓我們先來看一個(gè)例子,以下例子兩條print語句分別打印什么:

x = 100
def fn1():
    x +=1
    print(f"函數(shù)內(nèi)的{x}")
fn1()
print(f"變更后的{x}")

運(yùn)行結(jié)果:

為什么會運(yùn)行報(bào)錯(cuò):X在使用前需要先分配變量值,明明我們在全局已經(jīng)定義了一個(gè)X=100
原因:在python動態(tài)語言內(nèi),== 賦值即定義== ,在inner內(nèi)部

  • x += 1其實(shí)是一個(gè)x = x+1的賦值語句,那這個(gè)x就會函數(shù)運(yùn)行在初始化進(jìn)行加載,變成局部的一個(gè)變量
  • 而=運(yùn)算時(shí),從左往右執(zhí)行,在x=的時(shí)候已經(jīng)默許了x是local variable,因此外部作用域的x=100是被屏蔽的。所以x+1中的x相當(dāng)于一個(gè)沒有賦值的變量,從而報(bào)錯(cuò)。

那么怎么解決這個(gè)問題?解決的辦法一:使用global關(guān)建字將x定義為全局變量,這時(shí)在函數(shù)局部就會將x指向全局的變量x

讓我們來看看具體的應(yīng)用,下面的代碼運(yùn)行結(jié)果如何:

x = 100
def fn1():
    x = 10
    global x
    x +=1
    print(f"函數(shù)內(nèi)的{x}")
fn1()
print(f"變更后的{x}")

運(yùn)行結(jié)果:

為什么還是報(bào)錯(cuò),我們不是已經(jīng)使用了global嗎?那是因?yàn)槲覀兦懊媛暶髑凹恿艘痪洌簒 = 10
x = 10 時(shí)會將其置為局部變量,但程序執(zhí)行到global x時(shí),發(fā)現(xiàn)x已經(jīng)在局部定義過了,所以報(bào)錯(cuò),所以我們要先聲明再調(diào)用

所以我們將程序調(diào)整為:

那么問題又來了,下面的例子,global x在inner函數(shù)內(nèi)可以調(diào)用嗎?

x = 100
def outer():
    global x
    x +=1
    print(f"ouer的x調(diào)用結(jié)果{x}")
    def inner():
        x +=1
        print(f"inner的x調(diào)用結(jié)果{x}")
    return inner
a = outer()
a()

運(yùn)行結(jié)果:

為什么報(bào)錯(cuò),不是已經(jīng)定義了global全局變量,同時(shí)也是局部作用域內(nèi)先定義了嗎?

原因:Global 定義只在全局和定義的當(dāng)前作用域內(nèi)起作用,所以上面的例子,global x只在全局作用域和嵌套作用域內(nèi)可用,如果inner內(nèi)部想調(diào)用,需要做以下調(diào)整

特別說明:

global關(guān)鍵字是一種破壞函數(shù)封裝的方式,變量未經(jīng)過傳參即可在函數(shù)內(nèi)部作用域內(nèi)使用。所以在日常使用中,**不要使用,那我們要實(shí)現(xiàn)這種調(diào)用,可以用什么方式呢?python給我提供了一個(gè)關(guān)鍵字:Nolocal,后續(xù)我的筆記中會詳細(xì)提到

到此這篇關(guān)于Python函數(shù)命名空間,作用域LEGB及Global詳析的文章就介紹到這了,更多相關(guān)Python LEGB與Global內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

应用必备| 调兵山市| 平南县| 渝北区| 金阳县| 临夏县| 墨玉县| 泸州市| 资源县| 安福县| 栾川县| 青铜峡市| 云安县| 千阳县| 邹城市| 犍为县| 岳阳县| 八宿县| 深圳市| 杭州市| 会昌县| 来宾市| 华池县| 久治县| 广饶县| 四川省| 上饶县| 宜州市| 新绛县| 凤台县| 姜堰市| 吴桥县| 庄浪县| 巴东县| 尖扎县| 江达县| 伊金霍洛旗| 开封市| 揭西县| 大埔县| 加查县|