淺析Python中作用域的應用
什么是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中,另一個在上層。當print_pi()被執(zhí)行時,'inner pi variable’被打印為函數(shù)命名空間內(nèi)的pi值。當pi在外部命名空間中被引用時,輸出值“outer pi variable”。從上面的例子中,我們可以猜測,在決定從哪個命名空間中選擇變量時,肯定有一個遵循的規(guī)則。
Python中的作用域LEGB規(guī)則
在Python中,LEGB規(guī)則用于決定搜索命名空間以進行作用域解析的順序。以下按層次結構列出了范圍(從最高到最低/從最窄到最寬):
- Local(L):定義在函數(shù)/類內(nèi)部
- Enclosed(E):定義在封閉函數(shù)內(nèi)(嵌套函數(shù)概念)
- Global(G):定義在全局(最上層)中
- Built-in(B):Python內(nèi)置模塊中的保留名稱

Python中的局部作用域
局部作用域引用當前函數(shù)中定義的變量。函數(shù)總是會首先在其局部作用域中查找變量名。只有當它在那里沒有找到它時,才檢查外部范圍。
# Local Scope
pi = 'global pi variable'
def inner():
pi = 'inner pi variable'
print(pi)
inner()輸出
inner pi variable
在運行上面的程序時,內(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
因此,正如預期的那樣,程序在執(zhí)行inner()時打印出局部作用域中的值。這是因為它是在函數(shù)內(nèi)部定義的,這是變量被查找的第一個地方。全局范圍內(nèi)的pi值在第8行執(zhí)行print(pi)時打印。
局部、封閉和全局作用域
對于封閉的作用域,我們需要定義一個包含內(nèi)部函數(shù)的外部函數(shù),注釋掉內(nèi)部函數(shù)的局部pi變量,并使用nonlocal關鍵字引用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
當outer()被執(zhí)行時,inner()和相應的print函數(shù)被執(zhí)行,它們打印所包含的pi變量的值。第10行的語句在inner的局部作用域中查找變量,但在那里找不到它。由于pi是用nonlocal關鍵字引用的,這意味著pi需要從外部函數(shù)(即外部作用域)訪問。總而言之,pi變量在局部作用域中找不到,所以要查找更高的作用域。在封閉和全局作用域中都可以找到它。但是根據(jù)LEGB層次結構,即使我們在全局范圍中定義了一個變量,也會考慮封閉的范圍變量。
局部、封閉、全局和內(nèi)置作用域
最后的檢查可以通過從math模塊導入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ù)學模塊導入的pi值。所以程序能夠在最外層范圍內(nèi)找到pi的值。
到此這篇關于淺析Python中作用域的應用的文章就介紹到這了,更多相關Python作用域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python的Scrapy框架中的CrawlSpider介紹和使用
這篇文章主要介紹了Python的Scrapy框架中的CrawlSpider介紹和使用,CrawlSpider其實是Spider的一個子類,除了繼承到Spider的特性和功能外,還派生除了其自己獨有的更加強大的特性和功能,其中最顯著的功能就是"LinkExtractors鏈接提取器",需要的朋友可以參考下2023-12-12
Python腳本實現(xiàn)監(jiān)聽服務器的思路代碼詳解
這篇文章主要介紹了Python腳本實現(xiàn)監(jiān)聽服務器的思路,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Python argparse模塊實現(xiàn)解析命令行參數(shù)方法詳解
argparse 是 python 自帶的命令行參數(shù)解析包,可以用來方便的服務命令行參數(shù)。本文將通過示例和大家詳細講講argparse的使用,需要的可以參考一下2022-09-09
Python中解決schedule模塊安裝與使用問題的完整指南
在 Python 開發(fā)中,定時任務是一個非常常見的需求,schedule 是一個輕量級的 Python 庫,專門用于簡化定時任務的實現(xiàn),本文將圍繞 schedule 模塊的安裝與使用進行詳細介紹,希望對大家有所幫助2025-03-03
django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼
這篇文章主要介紹了django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2019-08-08
對python中 math模塊下 atan 和 atan2的區(qū)別詳解
今天小編就為大家分享一篇對python中 math模塊下 atan 和 atan2的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

