淺析Python中作用域的應(yīng)用
什么是Python中的命名空間
python命名空間是一個(gè)容器,其中名稱映射到對象,它們用于避免在不同命名空間中存在相同名稱的情況下發(fā)生混淆。它們由模塊、函數(shù)、類等創(chuàng)建。
Python中的作用域是什么
作用域定義了必須搜索名稱空間以獲得名稱到對象(變量)的映射的層次順序。它是一個(gè)上下文,變量存在于其中,并從其中引用它們。它定義了變量的可訪問性和生存期。讓我們舉一個(gè)簡單的例子,如下所示:
pi = 'outer pi variable' def print_pi(): pi = 'inner pi variable' print(pi) print_pi() print(pi)
輸出
inner pi variable
outer pi variable
上面的程序給出了不同的輸出,因?yàn)橄嗤淖兞棵鹥i駐留在不同的命名空間中,一個(gè)在函數(shù)print_pi中,另一個(gè)在上層。當(dāng)print_pi()被執(zhí)行時(shí),'inner pi variable’被打印為函數(shù)命名空間內(nèi)的pi值。當(dāng)pi在外部命名空間中被引用時(shí),輸出值“outer pi variable”。從上面的例子中,我們可以猜測,在決定從哪個(gè)命名空間中選擇變量時(shí),肯定有一個(gè)遵循的規(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)它在那里沒有找到它時(shí),才檢查外部范圍。
# Local Scope pi = 'global pi variable' def inner(): pi = 'inner pi variable' print(pi) inner()
輸出
inner pi variable
在運(yùn)行上面的程序時(shí),內(nèi)部函數(shù)的執(zhí)行打印其局部(LEGB規(guī)則中的最高優(yōu)先級)變量pi的值,因?yàn)樗诰植孔饔糜蛑卸x并可用。
局部和全局作用域
如果一個(gè)變量沒有在局部范圍中定義,則在更高的范圍中檢查它,在本例中是全局范圍。
# 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í)打印出局部作用域中的值。這是因?yàn)樗窃诤瘮?shù)內(nèi)部定義的,這是變量被查找的第一個(gè)地方。全局范圍內(nèi)的pi值在第8行執(zhí)行print(pi)時(shí)打印。
局部、封閉和全局作用域
對于封閉的作用域,我們需要定義一個(gè)包含內(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í)行時(shí),inner()和相應(yīng)的print函數(shù)被執(zhí)行,它們打印所包含的pi變量的值。第10行的語句在inner的局部作用域中查找變量,但在那里找不到它。由于pi是用nonlocal關(guān)鍵字引用的,這意味著pi需要從外部函數(shù)(即外部作用域)訪問??偠灾?,pi變量在局部作用域中找不到,所以要查找更高的作用域。在封閉和全局作用域中都可以找到它。但是根據(jù)LEGB層次結(jié)構(gòu),即使我們在全局范圍中定義了一個(gè)變量,也會考慮封閉的范圍變量。
局部、封閉、全局和內(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)文章
Python的Scrapy框架中的CrawlSpider介紹和使用
這篇文章主要介紹了Python的Scrapy框架中的CrawlSpider介紹和使用,CrawlSpider其實(shí)是Spider的一個(gè)子類,除了繼承到Spider的特性和功能外,還派生除了其自己獨(dú)有的更加強(qiáng)大的特性和功能,其中最顯著的功能就是"LinkExtractors鏈接提取器",需要的朋友可以參考下2023-12-12Python腳本實(shí)現(xiàn)監(jiān)聽服務(wù)器的思路代碼詳解
這篇文章主要介紹了Python腳本實(shí)現(xiàn)監(jiān)聽服務(wù)器的思路,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python argparse模塊實(shí)現(xiàn)解析命令行參數(shù)方法詳解
argparse 是 python 自帶的命令行參數(shù)解析包,可以用來方便的服務(wù)命令行參數(shù)。本文將通過示例和大家詳細(xì)講講argparse的使用,需要的可以參考一下2022-09-09Python中解決schedule模塊安裝與使用問題的完整指南
在 Python 開發(fā)中,定時(shí)任務(wù)是一個(gè)非常常見的需求,schedule 是一個(gè)輕量級的 Python 庫,專門用于簡化定時(shí)任務(wù)的實(shí)現(xiàn),本文將圍繞 schedule 模塊的安裝與使用進(jìn)行詳細(xì)介紹,希望對大家有所幫助2025-03-03django中上傳圖片分頁三級聯(lián)動效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了django中上傳圖片分頁三級聯(lián)動效果的實(shí)現(xiàn)代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-08-08對python中 math模塊下 atan 和 atan2的區(qū)別詳解
今天小編就為大家分享一篇對python中 math模塊下 atan 和 atan2的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01