理解Python中的global與nonlocal關(guān)鍵字
theme: smartblue
在使用Python函數(shù)時,有些人會對變量作用域感到困惑。特別是在函數(shù)內(nèi)部想要修改外部變量時,常常會遇到各種報錯。為什么報錯就不得而知了。
所以呢咱們的python語言也是很聰明的引進了global和nonlocal這兩個關(guān)鍵字就派上用場了。它們就像是變量世界的“通行證”,允許你在不同的作用域中操作變量。解決了咱們對修改變量時的難處。這次就深刨一下下這兩個關(guān)鍵字。
下面就開始正式的解刨:
變量作用域
先來理解Python的作用域規(guī)則。這個很簡單我們直接讀取官方文檔的說明吧:


上面這兩幅官網(wǎng)文檔截圖已經(jīng)完全告訴我們了global和nonlocal的作用域規(guī)則:
其他廢話也就不多說了,如果想更加了解的話可移步到官方文檔:python語言參考手冊
接下來主要看它們的用法與區(qū)別:
global關(guān)鍵字
當(dāng)需要在函數(shù)內(nèi)部修改全局變量時,就需要使用global關(guān)鍵字。它相當(dāng)于拿到了修改整個環(huán)境的許可。
看這個典型問題:
x = 10 # 全局變量
def modify():
x = 20 # 這實際上創(chuàng)建了一個新的局部變量
print("函數(shù)內(nèi)x:", x)
modify()
print("全局x:", x) # 輸出還是10,沒被修改運行結(jié)果:

很明顯,函數(shù)內(nèi)部的賦值操作并沒有改變?nèi)肿兞縳的值,而是創(chuàng)建了一個新的局部變量。這時候如果用上global的話呢,我們看看:
x = 10
def modify():
global x # 聲明我們要使用全局變量x
x = 20 # 現(xiàn)在修改的是全局變量
modify()
print(f"全局x被修改為:{x}", )
這時候我們就知道了:哦!當(dāng)你需要在多個函數(shù)中共享和修改同一個變量時,就得用到global了。比如配置項的全局管理、程序運行狀態(tài)的跟蹤等。
但是global雖然方便,所有東西都不能過度使用的。不然有可能破壞函數(shù)的封裝性。
nonlocal關(guān)鍵字
nonlocal用于嵌套函數(shù)的情況,它允許內(nèi)部函數(shù)修改外部嵌套函數(shù)中的變量 (但不是全局變量)。
看個例子:
def outer():
x = 10
def inner():
x = 20 # 這創(chuàng)建了一個新的inner局部變量
print(f"inner中的x:{x}", )
inner()
print(f"outer中的x:{x}", )
outer()運行結(jié)果:

inner函數(shù)并沒能修改outer函數(shù)的變量x。那怎么能把它改了呢?這時候就需要nonlocal:
def outer():
x = 10
def inner():
""" 聲明使用外部嵌套函數(shù)的x"""
nonlocal x
x = 20 # 這創(chuàng)建了一個新的inner局部變量
print(f"inner中的x:{x}", )
inner()
print(f"outer中的x:{x}", )
outer()運行結(jié)果已經(jīng)修改:

使用場景:nonlocal在閉包和裝飾器中特別有用。當(dāng)你需要在一個內(nèi)部函數(shù)中記錄外部函數(shù)的狀態(tài)時,nonlocal提供了一種簡潔的方式。
注意事項:nonlocal只能用于嵌套函數(shù)中,且變量必須在外部函數(shù)中已定義。它不能用于全局變量。
兩者區(qū)別與選擇
- global用于修改全局變量(模塊級別)
- nonlocal用于修改嵌套函數(shù)中的變量(閉包情況)
- 兩者都不需要先賦值再使用,只需要聲明即可
選擇使用哪個的關(guān)鍵是看你要修改的變量在哪個作用域:
- 如果是模塊最外層的變量,用global
- 如果是外部函數(shù)的變量,用nonlocal
很多時候,使用返回值或?qū)ο髮傩员戎苯有薷耐獠孔兞扛?;Python查找變量的順序是:局部→外部嵌套→全局→內(nèi)置,
如果聲明了global或nonlocal但外部沒有對應(yīng)變量,會引發(fā)錯誤。
好了,關(guān)于global與nonlocal的內(nèi)容就分享這么多,想更更深層去理解的話就去官網(wǎng)文檔看看吧。
到此這篇關(guān)于理解Python中的global與nonlocal關(guān)鍵字的文章就介紹到這了,更多相關(guān)Python global與nonlocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python函數(shù)中g(shù)lobal與nonlocal關(guān)鍵字的使用詳解
- Python中nonlocal和global的區(qū)別及閉包使用
- 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中輕量型數(shù)據(jù)庫SQLite3的用法
SQLite 是一個極受歡迎的輕量級數(shù)據(jù)庫,它被廣泛應(yīng)用于各種大小的項目中,本文將詳細介紹 Python 中如何使用 SQLite3 庫進行數(shù)據(jù)庫操作,感興趣的小伙伴可以了解下2025-07-07
python利用smtplib實現(xiàn)QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細介紹了python利用smtplib實現(xiàn)QQ郵箱發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
python openCV實現(xiàn)攝像頭獲取人臉圖片
這篇文章主要為大家詳細介紹了python openCV實現(xiàn)攝像頭獲取人臉圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08
Pytorch自定義Dataset和DataLoader去除不存在和空數(shù)據(jù)的操作
這篇文章主要介紹了Pytorch自定義Dataset和DataLoader去除不存在和空數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Pandas之Fillna填充缺失數(shù)據(jù)的方法
這篇文章主要介紹了Pandas之Fillna填充缺失數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Django之使用celery和NGINX生成靜態(tài)頁面實現(xiàn)性能優(yōu)化
這篇文章主要介紹了Django之使用celery和NGINX生成靜態(tài)頁面實現(xiàn)性能優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

