python?nonlocal的用法詳解
官網(wǎng)的nonlocal的用法
1,非局部聲明變量指代的已有標(biāo)識(shí)符是最近外面函數(shù)的已聲明變量,但是不包括全局變量。這個(gè)是很重要的,因?yàn)榻壎ǖ哪J(rèn)行為是首先搜索本地命名空間。nonlocal聲明的變量只對(duì)局部起作用,離開封裝函數(shù),那么該變量就無(wú)效。
2,非局部聲明不像全局聲明,我們必須在封裝函數(shù)前面事先聲明該變量
3,非局部聲明不能與局部范圍的聲明沖突
第一點(diǎn):
count = 1 # 這里是聲明的是全局變量,對(duì)于nonlocal來(lái)說(shuō)全局變量是不包括的
def a():
count = 'a函數(shù)里面' # 這里對(duì)于nonlocal來(lái)說(shuō)就是外面的函數(shù)已聲明的變量
def b():
nonlocal count # nonlocal count指的是函數(shù)b內(nèi)
print(count)
count = 2
b()
print(count)
if __name__ == '__main__':
a()
print(count)
count = 1
def a():
# count = 'a函數(shù)里面' # SyntaxError: no binding for nonlocal 'count' found
def b():
nonlocal count
print(count)
count = 2
b()
print(count)
if __name__ == '__main__':
a()
print(count)
像上面的代碼,如果nonlocal執(zhí)行前,沒(méi)有在局部里先聲明局部變量,就會(huì)報(bào)錯(cuò)找不到局部變量,因?yàn)閚onlocal是不會(huì)查全局變量。
nonlocal的作用:
1,nonlocal可以讓最里面的函數(shù)使用最近的一個(gè)外函數(shù)已聲明的變量,將最里面的函數(shù)的局部變量設(shè)置和最近的一個(gè)外函數(shù)聲明的變量為同一個(gè)變量(引用同一個(gè)內(nèi)存地址)。例如下面的代碼,c函數(shù)聲明了nonlocal count,那么c函數(shù)就可以用最近函數(shù)b聲明的count=2,并且可以對(duì)b.count賦值。(注意:nonlocal不會(huì)使用全局變量)
count = 1
def a():
count = 'a函數(shù)里面'
def b():
count = 2
print(count)
def c():
nonlocal count
print(count)
c()
b()
print(count)
if __name__ == '__main__':
a()
print(count)
2
2
a函數(shù)里面
1
案例:引用官網(wǎng)的例子對(duì)global,nonlocal,全局變量的關(guān)系解釋
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
上面案例代碼看出:
1,do_local函數(shù)下定義的局部變量spam不會(huì)改變scope_test函數(shù)定義的局部變量spam。
2,do_nonlocal函數(shù)下nonlocal非本地聲明,將do_nonlocal函數(shù)下的局部變量spam聲明為非do_nonlocal函數(shù)本地,而是將do_nonlocal.spam聲明和scope_test.spam為同一個(gè)變量。
3,do_global函數(shù)下global全局聲明spam為全局變量,但是依然不會(huì)改變scope_test.spam的局部變量,說(shuō)明global全局聲明對(duì)局部的變量不產(chǎn)生作用。
4,在全局引用全局聲明global的全局變量spam是可以的。
總結(jié)
到此這篇關(guān)于python nonlocal用法詳解的文章就介紹到這了,更多相關(guān)python nonlocal用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python報(bào)錯(cuò)ValueError:?cannot?convert?float?NaN?to?intege
在Python編程中,我們經(jīng)常需要處理各種數(shù)據(jù)類型,包括浮點(diǎn)數(shù)和整數(shù),然而,有時(shí)候我們可能會(huì)遇到一些意外的情況,比如將一個(gè)包含NaN(Not?a?Number)的浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)時(shí),就會(huì)拋出錯(cuò)誤,本文將探討這個(gè)錯(cuò)誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下2024-09-09
Python實(shí)現(xiàn)剪刀石頭布小游戲(與電腦對(duì)戰(zhàn))
這篇文章給大家分享Python基礎(chǔ)實(shí)現(xiàn)與電腦對(duì)戰(zhàn)的剪刀石頭布小游戲,練習(xí)if while輸入和輸出,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12
python 實(shí)用工具狀態(tài)機(jī)transitions
這篇文章主要介紹了python 實(shí)用工具狀態(tài)機(jī)transitions的使用,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11
PyQt5實(shí)現(xiàn)平滑移動(dòng)側(cè)邊菜單欄效果的示例
本文主要介紹了PyQt5實(shí)現(xiàn)平滑移動(dòng)側(cè)邊菜單欄效果的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
python文件頭部聲明#coding=utf-8問(wèn)題
這篇文章主要介紹了python文件頭部聲明#coding=utf-8問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
K最近鄰算法(KNN)---sklearn+python實(shí)現(xiàn)方式
今天小編就為大家分享一篇K最近鄰算法(KNN)---sklearn+python實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python實(shí)現(xiàn)簡(jiǎn)單遺傳算法
這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單遺傳算法,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下2020-09-09

