Python中nonlocal和global的區(qū)別及閉包使用
一、nonlocal和global的區(qū)別
作用范圍
- global:用于在函數(shù)內(nèi)部聲明一個(gè)變量是全局變量。如果在函數(shù)中使用
global關(guān)鍵字聲明了某個(gè)變量,那么在函數(shù)內(nèi)部對(duì)該變量的操作,就是對(duì)全局作用域中這個(gè)變量的操作。例如:
count = 10
def modify_count():
global count
count = 20
print(count)
modify_count() # 輸出 20
print(count) # 輸出 20,全局變量count已經(jīng)被修改
- nonlocal:用于在嵌套函數(shù)中,聲明一個(gè)變量不是當(dāng)前函數(shù)的局部變量,而是來(lái)自外層(非全局)函數(shù)的變量。它使得內(nèi)層函數(shù)可以修改外層函數(shù)中定義的變量,前提是外層函數(shù)中沒(méi)有使用
global聲明這個(gè)變量。比如:
def outer():
num = 5
def inner():
nonlocal num
num = 10
print(num)
inner()
print(num)
outer()
# 輸出 10
# 輸出 10,因?yàn)閮?nèi)層函數(shù)通過(guò)nonlocal修改了外層函數(shù)的num變量
適用場(chǎng)景
- global:當(dāng)需要在函數(shù)內(nèi)部修改全局作用域中的變量時(shí)使用。
- nonlocal:在函數(shù)嵌套的場(chǎng)景下,內(nèi)層函數(shù)想要修改外層函數(shù)中定義的變量,且該變量不是全局變量時(shí)使用。
二、閉包的作用
數(shù)據(jù)隱藏與封裝
閉包可以將一些數(shù)據(jù)(即外層函數(shù)的變量)與操作這些數(shù)據(jù)的函數(shù)綁定在一起,形成一個(gè)相對(duì)獨(dú)立的單元,外界不能直接訪問(wèn)這些被 “隱藏” 的數(shù)據(jù),只能通過(guò)閉包返回的函數(shù)來(lái)操作。例如,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器:
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
count_func = counter()
print(count_func()) # 輸出 1
print(count_func()) # 輸出 2
print(count_func()) # 輸出 3
在這個(gè)例子中,count 變量被隱藏在閉包內(nèi)部,外界無(wú)法直接訪問(wèn)和修改,只能通過(guò) increment 函數(shù)來(lái)對(duì)其進(jìn)行遞增操作,實(shí)現(xiàn)了數(shù)據(jù)的封裝。
狀態(tài)保持
閉包可以 “記住” 外層函數(shù)執(zhí)行時(shí)的變量狀態(tài),方便在多次調(diào)用返回的函數(shù)時(shí),基于之前的狀態(tài)進(jìn)行操作。比如模擬一個(gè)累加器:
def accumulator(initial_value=0):
def accumulate(num):
nonlocal initial_value
initial_value += num
return initial_value
return accumulate
acc = accumulator(5)
print(acc(3)) # 輸出 8,初始值5加上傳入的3
print(acc(2)) # 輸出 10,基于上一次結(jié)果8再加上傳入的2
這里閉包記住了 initial_value 的狀態(tài),每次調(diào)用 accumulate 函數(shù)時(shí),都是基于上一次的狀態(tài)進(jìn)行累加操作。
函數(shù)復(fù)用
閉包可以創(chuàng)建具有特定初始狀態(tài)的函數(shù),方便在不同場(chǎng)景下復(fù)用。比如創(chuàng)建不同稅率的計(jì)算函數(shù):
def tax_calculator(tax_rate):
def calculate_tax(amount):
return amount * tax_rate
return calculate_tax
calculate_sales_tax = tax_calculator(0.08) # 8% 的銷售稅
calculate_income_tax = tax_calculator(0.2) # 20% 的所得稅
print(calculate_sales_tax(100)) # 輸出 8
print(calculate_income_tax(1000)) # 輸出 200
通過(guò) tax_calculator 函數(shù)創(chuàng)建不同稅率的計(jì)算函數(shù),這些函數(shù)都能復(fù)用內(nèi)部計(jì)算邏輯,只是初始的稅率不同。
三、注意
在 Python 中,內(nèi)部函數(shù)本來(lái)就可以 “讀取” 外層函數(shù)的變量(包括參數(shù)),但只有通過(guò) nonlocal 聲明后,才能 “修改” 外層函數(shù)的變量。
到此這篇關(guān)于Python中nonlocal和global的區(qū)別及閉包使用的文章就介紹到這了,更多相關(guān)Python nonlocal和global內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python函數(shù)中g(shù)lobal與nonlocal關(guān)鍵字的使用詳解
- 理解Python中的global與nonlocal關(guān)鍵字
- Python中的global和nonlocal關(guān)鍵字的使用場(chǎng)景分析
- Python中的global與nonlocal關(guān)鍵字詳解
- 淺析Python中g(shù)lobal和nonlocal關(guān)鍵字的妙用
- Python?nonlocal關(guān)鍵字?與?global?關(guān)鍵字解析
- Python關(guān)鍵字之global與nonlocal
- 系統(tǒng)講解Python函數(shù)中g(shù)lobal與nonlocal關(guān)鍵字的使用
相關(guān)文章
Python獲取網(wǎng)絡(luò)圖片和視頻的示例代碼
Python 是一種多用途語(yǔ)言,廣泛用于腳本編寫(xiě)。我們可以編寫(xiě)Python 腳本來(lái)自動(dòng)化日常事務(wù)。本文將用Python實(shí)現(xiàn)獲取Google圖片和YouTube視頻,需要的可以參考一下2022-03-03
對(duì)Python的Django框架中的項(xiàng)目進(jìn)行單元測(cè)試的方法
這篇文章主要介紹了對(duì)Python的Django框架中的項(xiàng)目進(jìn)行單元測(cè)試的方法,使用Django中的tests.py模塊可以輕松地檢測(cè)出一些常見(jiàn)錯(cuò)誤,需要的朋友可以參考下2016-04-04
淺談Django QuerySet對(duì)象(模型.objects)的常用方法
這篇文章主要介紹了淺談Django QuerySet對(duì)象(模型.objects)的常用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
基于python的圖片修復(fù)程序(實(shí)現(xiàn)水印去除)
這篇文章主要給大家介紹了關(guān)于python圖片修復(fù)程序的相關(guān)資料,可以用于實(shí)現(xiàn)圖片中水印去除,主要利用的是OpenCV這個(gè)框架實(shí)現(xiàn)的,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧2018-06-06
Python實(shí)現(xiàn)爬取知乎神回復(fù)簡(jiǎn)單爬蟲(chóng)代碼分享
這篇文章主要介紹了Python實(shí)現(xiàn)爬取知乎神回復(fù)簡(jiǎn)單爬蟲(chóng)代碼分享,本文實(shí)現(xiàn)了爬取知乎的“如何正確地吐槽”收藏夾,是對(duì)個(gè)人的一個(gè)興趣實(shí)現(xiàn),需要的朋友可以參考下2015-01-01
詳解TensorFlow訓(xùn)練網(wǎng)絡(luò)兩種方式
本文主要介紹了TensorFlow訓(xùn)練網(wǎng)絡(luò)兩種方式,一種是基于tensor(array),另外一種是迭代器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

