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

