Python中的作用域==和is的區(qū)別及說明
作用域
LEGB規(guī)則:
locals -> enclosing function -> globals -> builtins,依次是局部作用域---->嵌套作用域————>全局作用域——>內(nèi)建作用域
globals()和locals()函數(shù)可以獲取當(dāng)前的全局和局部作用域的所有變量
在Python中并不是所有的語句塊中都會產(chǎn)生作用域。
只有當(dāng)變量在Module(模塊)、Class(類)、def(函數(shù))中定義的時候,才會有作用域的概念。
需要注意的是:
在if-elif-else、for-else、while、try-except\try-finally等關(guān)鍵字的語句塊中并不會產(chǎn)成作用域。
if True: a = 100 print(a) -----100
L(local)局部作用域
局部變量:
包含在def關(guān)鍵字定義的語句塊中,即在函數(shù)中定義的變量。
每當(dāng)函數(shù)被調(diào)用時都會創(chuàng)建一個新的局部作用域。
需要在函數(shù)內(nèi)部定義全局變量,這時可以使用global關(guān)鍵字來聲明變量的作用域為全局。
局部變量僅暫時存在,依賴創(chuàng)建該局部作用域的函數(shù)是否處于活動的狀態(tài)。
E(enclosing)嵌套作用域
E也包含在def關(guān)鍵字中,E和L是相對的,E相對于更上層的函數(shù)而言也是L。
與L的區(qū)別在于,對一個函數(shù)而言,L是定義在此函數(shù)內(nèi)部的局部作用域,而E是定義在此函數(shù)的上一層父級函數(shù)的局部作用域。
主要是為了實現(xiàn)Python的閉包,而增加的實現(xiàn)。
G(global)全局作用域
即在模塊層次中定義的變量,每一個模塊都是一個全局作用域。
也就是說,在模塊文件頂層聲明的變量具有全局作用域,從外部開來,模塊的全局變量就是一個模塊對象的屬性。
注意:
全局作用域的作用范圍僅限于單個模塊文件內(nèi)
B(built-in)內(nèi)置作用域
系統(tǒng)內(nèi)固定模塊里定義的變量,如預(yù)定義在builtin 模塊內(nèi)的變量。
variable = 300 def test_scopt(): print (variable) #variable是test_scopt()的局部變量,但是在打印時并沒有綁定內(nèi)存對象。 variable = 200 #因為這里,所以variable就變?yōu)榱司植孔兞? test_scopt() print (variable)
上述例子會報UnboundLocalError,因為在執(zhí)行程序時的預(yù)編譯能夠在test_scopt()中找到局部變量variable(對variable進行了賦值)。
在局部作用域找到了變量名,所以不會升級到嵌套作用域去尋找。
但是在使用print語句將變量variable打印時,局部變量variable并有沒綁定到一個內(nèi)存對象(沒有定義和初始化,即沒有賦值)。
本質(zhì)上還是Python調(diào)用變量時遵循的LEGB法則和Python解析器的編譯原理,決定了這個錯誤的發(fā)生。
所以,在調(diào)用一個變量之前,需要為該變量賦值(綁定一個內(nèi)存對象)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章

關(guān)于numpy和torch.tensor的張量的操作

Python輪播圖與導(dǎo)航欄功能的實現(xiàn)流程全講解