北京靠譜的網(wǎng)站建設(shè)谷歌商店下載不了軟件
Python 函數(shù)內(nèi)部可以定義變量,這樣就產(chǎn)生了局部變量,可能有人會(huì)問(wèn),Python 函數(shù)內(nèi)部能定義函數(shù)嗎?答案是肯定的。Python 支持在函數(shù)內(nèi)部定義函數(shù),此類函數(shù)又稱為局部函數(shù)。
那么,局部函數(shù)有哪些特征,在使用時(shí)需要注意什么呢?接下來(lái)就詳細(xì)介紹 Python 局部函數(shù)的用法。
首先,和局部變量一樣,默認(rèn)情況下局部函數(shù)只能在其所在函數(shù)的作用域內(nèi)使用。舉個(gè)例子:
#全局函數(shù)
def outdef ():#局部函數(shù)def indef():print("http://www.CSDN.net/")#調(diào)用局部函數(shù)indef()
#調(diào)用全局函數(shù)
outdef()
程序執(zhí)行結(jié)果為:
http://www.CSDN.net/
就如同全局函數(shù)返回其局部變量,就可以擴(kuò)大該變量的作用域一樣,通過(guò)將局部函數(shù)作為所在函數(shù)的返回值,也可以擴(kuò)大局部函數(shù)的使用范圍。例如,修改上面程序?yàn)?#xff1a;
#全局函數(shù)
def outdef ():#局部函數(shù)def indef():print("調(diào)用局部函數(shù)")#調(diào)用局部函數(shù)return indef
#調(diào)用全局函數(shù)
new_indef = outdef()
調(diào)用全局函數(shù)中的局部函數(shù)
new_indef()
程序執(zhí)行結(jié)果為:
調(diào)用局部函數(shù)
因此,對(duì)于局部函數(shù)的作用域,可以總結(jié)為:如果所在函數(shù)沒(méi)有返回局部函數(shù),則局部函數(shù)的可用范圍僅限于所在函數(shù)內(nèi)部;反之,如果所在函數(shù)將局部函數(shù)作為返回值,則局部函數(shù)的作用域就會(huì)擴(kuò)大,既可以在所在函數(shù)內(nèi)部使用,也可以在所在函數(shù)的作用域中使用。
以上面程序中的 outdef() 和 indef() 為例,如果 outdef() 不將 indef 作為返回值,則 indef() 只能在 outdef() 函數(shù)內(nèi)部使用;反之,則 indef() 函數(shù)既可以在 outdef() 函數(shù)內(nèi)部使用,也可以在 outdef() 函數(shù)的作用域,也就是全局范圍內(nèi)使用。
另外值得一提的是,如果局部函數(shù)中定義有和所在函數(shù)中變量同名的變量,也會(huì)發(fā)生“遮蔽”的問(wèn)題。例如:
#全局函數(shù)
def outdef ():name = "所在函數(shù)中定義的 name 變量"#局部函數(shù)def indef():print(name)name = "局部函數(shù)中定義的 name 變量"indef()
#調(diào)用全局函數(shù)
outdef()
執(zhí)行此程序,Python 解釋器會(huì)報(bào)如下錯(cuò)誤:
UnboundLocalError: local variable 'name' referenced before assignment
此錯(cuò)誤直譯過(guò)來(lái)的意思是“局部變量 name 還沒(méi)定義就使用”。導(dǎo)致該錯(cuò)誤的原因就在于,局部函數(shù) indef() 中定義的 name 變量遮蔽了所在函數(shù) outdef() 中定義的 name 變量。
再加上,indef() 函數(shù)中 name 變量的定義位于 print() 輸出語(yǔ)句之后,導(dǎo)致 print(name) 語(yǔ)句在執(zhí)行時(shí)找不到定義的 name 變量,因此程序報(bào)錯(cuò)。
由于這里的 name 變量也是局部變量,因此前面章節(jié)講解的 globals() 函數(shù)或者 globals 關(guān)鍵字,并不適用于解決此問(wèn)題。這里可以使用 Python 提供的 nonlocal 關(guān)鍵字。
例如,修改上面程序?yàn)?#xff1a;
#全局函數(shù)
def outdef ():name = "所在函數(shù)中定義的 name 變量"#局部函數(shù)def indef():nonlocal nameprint(name)#修改name變量的值name = "局部函數(shù)中定義的 name 變量"indef()
#調(diào)用全局函數(shù)
outdef()
程序執(zhí)行結(jié)果為:
所在函數(shù)中定義的 name 變量
?Python教程,8天python從入門到精通,學(xué)python看這套就夠了