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


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

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

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

使用場(chǎng)景:nonlocal在閉包和裝飾器中特別有用。當(dāng)你需要在一個(gè)內(nèi)部函數(shù)中記錄外部函數(shù)的狀態(tài)時(shí),nonlocal提供了一種簡(jiǎn)潔的方式。
注意事項(xiàng):nonlocal只能用于嵌套函數(shù)中,且變量必須在外部函數(shù)中已定義。它不能用于全局變量。
兩者區(qū)別與選擇
- global用于修改全局變量(模塊級(jí)別)
- nonlocal用于修改嵌套函數(shù)中的變量(閉包情況)
- 兩者都不需要先賦值再使用,只需要聲明即可
選擇使用哪個(gè)的關(guān)鍵是看你要修改的變量在哪個(gè)作用域:
- 如果是模塊最外層的變量,用global
- 如果是外部函數(shù)的變量,用nonlocal
很多時(shí)候,使用返回值或?qū)ο髮傩员戎苯有薷耐獠孔兞扛茫籔ython查找變量的順序是:局部→外部嵌套→全局→內(nèi)置,
如果聲明了global或nonlocal但外部沒(méi)有對(duì)應(yīng)變量,會(huì)引發(fā)錯(cuò)誤。
好了,關(guān)于global與nonlocal的內(nèi)容就分享這么多,想更更深層去理解的話(huà)就去官網(wǎng)文檔看看吧。
到此這篇關(guān)于理解Python中的global與nonlocal關(guān)鍵字的文章就介紹到這了,更多相關(guān)Python global與nonlocal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中的global和nonlocal關(guān)鍵字的使用場(chǎng)景分析
- Python中的global與nonlocal關(guān)鍵字詳解
- 淺析Python中g(shù)lobal和nonlocal關(guān)鍵字的妙用
- Python關(guān)鍵字之global與nonlocal
- python global和nonlocal用法解析
- Python中 Global和Nonlocal的用法詳解
- Python中關(guān)鍵字global和nonlocal的區(qū)別詳解
- Python中關(guān)鍵字nonlocal和global的聲明與解析
- python中g(shù)lobal與nonlocal比較
相關(guān)文章
python完成FizzBuzzWhizz問(wèn)題(拉勾網(wǎng)面試題)示例
這篇文章主要介紹了python完成FizzBuzzWhizz問(wèn)題(拉勾網(wǎng)面試題)示例,需要的朋友可以參考下2014-05-05
Pytorch 實(shí)現(xiàn)自定義參數(shù)層的例子
今天小編就為大家發(fā)信息一篇Pytorch 實(shí)現(xiàn)自定義參數(shù)層的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python利用字典樹(shù)實(shí)現(xiàn)獵詞游戲
獵詞(word hunt)是一類(lèi)很常見(jiàn)的游戲,給你一張字母組成的表,然后讓你在這些字母中盡可能多的去尋找單詞。這類(lèi)游戲用字典樹(shù)就能輕松完成,本文就來(lái)具體講講實(shí)現(xiàn)步驟,需要的可以參考一下2022-06-06
通過(guò)CartPole游戲詳解PPO?優(yōu)化過(guò)程
這篇文章主要為大家介紹了通過(guò)CartPole游戲詳解PPO?優(yōu)化過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Python Pyqt5多線(xiàn)程更新UI代碼實(shí)例(防止界面卡死)
這篇文章通過(guò)代碼實(shí)例給大家介紹了Python Pyqt5多線(xiàn)程更新UI防止界面卡死的問(wèn)題,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-12-12
linux下python使用sendmail發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了linux下python使用sendmail發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python批量將Word文檔(.doc)轉(zhuǎn)換為.docx格式的完整實(shí)現(xiàn)步驟
這篇文章主要介紹了Python批量將Word文檔(.doc)轉(zhuǎn)換為.docx格式的完整實(shí)現(xiàn)步驟,文中通過(guò)代碼介紹的非常詳細(xì),適用于Windows系統(tǒng),解決了手動(dòng)轉(zhuǎn)換的低效率和出錯(cuò)率問(wèn)題,需要的朋友可以參考下2024-12-12
使用Python編寫(xiě)vim插件的簡(jiǎn)單示例
這篇文章主要介紹了使用Python編寫(xiě)vim插件的簡(jiǎn)單教程,文中舉了一個(gè)獲取reddit首頁(yè)信息并顯示在緩沖區(qū)中的例子,需要的朋友可以參考下2015-04-04
Python?Opencv中獲取卷積核的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python?Opencv中獲取卷積核的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

