淺析Python中作用域的應(yīng)用
什么是Python中的命名空間
python命名空間是一個容器,其中名稱映射到對象,它們用于避免在不同命名空間中存在相同名稱的情況下發(fā)生混淆。它們由模塊、函數(shù)、類等創(chuàng)建。
Python中的作用域是什么
作用域定義了必須搜索名稱空間以獲得名稱到對象(變量)的映射的層次順序。它是一個上下文,變量存在于其中,并從其中引用它們。它定義了變量的可訪問性和生存期。讓我們舉一個簡單的例子,如下所示:
pi = 'outer pi variable'
def print_pi():
pi = 'inner pi variable'
print(pi)
print_pi()
print(pi)輸出
inner pi variable
outer pi variable
上面的程序給出了不同的輸出,因為相同的變量名pi駐留在不同的命名空間中,一個在函數(shù)print_pi中,另一個在上層。當(dāng)print_pi()被執(zhí)行時,'inner pi variable’被打印為函數(shù)命名空間內(nèi)的pi值。當(dāng)pi在外部命名空間中被引用時,輸出值“outer pi variable”。從上面的例子中,我們可以猜測,在決定從哪個命名空間中選擇變量時,肯定有一個遵循的規(guī)則。
Python中的作用域LEGB規(guī)則
在Python中,LEGB規(guī)則用于決定搜索命名空間以進(jìn)行作用域解析的順序。以下按層次結(jié)構(gòu)列出了范圍(從最高到最低/從最窄到最寬):
- Local(L):定義在函數(shù)/類內(nèi)部
- Enclosed(E):定義在封閉函數(shù)內(nèi)(嵌套函數(shù)概念)
- Global(G):定義在全局(最上層)中
- Built-in(B):Python內(nèi)置模塊中的保留名稱

Python中的局部作用域
局部作用域引用當(dāng)前函數(shù)中定義的變量。函數(shù)總是會首先在其局部作用域中查找變量名。只有當(dāng)它在那里沒有找到它時,才檢查外部范圍。
# Local Scope
pi = 'global pi variable'
def inner():
pi = 'inner pi variable'
print(pi)
inner()輸出
inner pi variable
在運(yùn)行上面的程序時,內(nèi)部函數(shù)的執(zhí)行打印其局部(LEGB規(guī)則中的最高優(yōu)先級)變量pi的值,因為它在局部作用域中定義并可用。
局部和全局作用域
如果一個變量沒有在局部范圍中定義,則在更高的范圍中檢查它,在本例中是全局范圍。
# Global Scope
pi = 'global pi variable'
def inner():
pi = 'inner pi variable'
print(pi)
inner()
print(pi)輸出
inner pi variable
global pi variable
因此,正如預(yù)期的那樣,程序在執(zhí)行inner()時打印出局部作用域中的值。這是因為它是在函數(shù)內(nèi)部定義的,這是變量被查找的第一個地方。全局范圍內(nèi)的pi值在第8行執(zhí)行print(pi)時打印。
局部、封閉和全局作用域
對于封閉的作用域,我們需要定義一個包含內(nèi)部函數(shù)的外部函數(shù),注釋掉內(nèi)部函數(shù)的局部pi變量,并使用nonlocal關(guān)鍵字引用pi。
# Enclosed Scope
pi = 'global pi variable'
def outer():
pi = 'outer pi variable'
def inner():
# pi = 'inner pi variable'
nonlocal pi
print(pi)
inner()
outer()
print(pi)輸出
outer pi variable
global pi variable
當(dāng)outer()被執(zhí)行時,inner()和相應(yīng)的print函數(shù)被執(zhí)行,它們打印所包含的pi變量的值。第10行的語句在inner的局部作用域中查找變量,但在那里找不到它。由于pi是用nonlocal關(guān)鍵字引用的,這意味著pi需要從外部函數(shù)(即外部作用域)訪問。總而言之,pi變量在局部作用域中找不到,所以要查找更高的作用域。在封閉和全局作用域中都可以找到它。但是根據(jù)LEGB層次結(jié)構(gòu),即使我們在全局范圍中定義了一個變量,也會考慮封閉的范圍變量。
局部、封閉、全局和內(nèi)置作用域
最后的檢查可以通過從math模塊導(dǎo)入pi并注釋全局、封閉和局部pi變量來完成,如下所示:
# Built-in Scope
from math import pi
# pi = 'global pi variable'
def outer():
# pi = 'outer pi variable'
def inner():
# pi = 'inner pi variable'
print(pi)
inner()
outer()輸出
3.141592653589793
由于pi沒有在局部、封閉或全局作用域中定義,因此會查找內(nèi)置作用域,即從數(shù)學(xué)模塊導(dǎo)入的pi值。所以程序能夠在最外層范圍內(nèi)找到pi的值。
到此這篇關(guān)于淺析Python中作用域的應(yīng)用的文章就介紹到這了,更多相關(guān)Python作用域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Python的高級數(shù)據(jù)結(jié)構(gòu)與算法
這篇文章主要介紹了關(guān)于Python的高級數(shù)據(jù)結(jié)構(gòu)與算法,掌握這些數(shù)據(jù)結(jié)構(gòu)和算法將幫助我們在實際編程中解決各種問題,提高我們的編程技巧和水平,需要的朋友可以參考下2023-04-04
Python中encode和encoding的區(qū)別小結(jié)
encode和encoding在Python中雖然都與字符編碼相關(guān),但它們的角色和用途是不同的,本文主要介紹了Python中encode和encoding的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-03-03
Python爬蟲入門案例之爬取去哪兒旅游景點攻略以及可視化分析
讀萬卷書不如行萬里路,學(xué)的扎不扎實要通過實戰(zhàn)才能看出來,本篇文章手把手帶你爬取去哪兒平臺的旅游景點攻略并進(jìn)行可視化分析,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
Python?async+request與async+aiohttp實現(xiàn)異步網(wǎng)絡(luò)請求探索
這篇文章主要介紹了Python?async+request與async+aiohttp實現(xiàn)異步網(wǎng)絡(luò)請求探索,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
Python實現(xiàn)批量獲取地址的經(jīng)緯度
在地理分析中,通常需要自己獲取經(jīng)緯度數(shù)據(jù),所以本文就來和大家介紹一下如何借助python與地圖接口來進(jìn)行經(jīng)緯度的爬取,感興趣的小伙伴可以了解下2025-05-05

