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

