閉包:高階函數(shù)除了可以接受函數(shù)作為參數(shù)外鸠姨,還可以把函數(shù)作為結(jié)果值返回铜秆。
先來(lái)看這樣一個(gè)函數(shù):
# a=1
def foo_x(x):
# b=2
def foo_y(y):
# c=3
return x*y
return foo_y
在這個(gè)代碼塊中,如果執(zhí)行foo_x享怀,那么順序流應(yīng)該是先創(chuàng)建foo_x羽峰,接著定義foo_y,而foo_y的功能在意返回xy的值趟咆,即調(diào)用foo_y得到 xy的值添瓷,此時(shí),再一次返回foo_y,也就是返回值x*y.
foo_y看做是一個(gè)內(nèi)部功能值纱,返回值鳞贷,而返回foo_y就是返回x*y.
注意
a屬于全局變量,b是一個(gè)定義在函數(shù)中的局部變量虐唠,屬于局部作用域搀愧,在foo_x函數(shù)的外部并不能訪問(wèn)到它;但對(duì)于foo_x函數(shù)內(nèi)部的foo_y函數(shù)來(lái)說(shuō)疆偿,變量b屬于嵌套作用域咱筛,在foo_y函數(shù)中我們是可以訪問(wèn)到它的。foo_y函數(shù)中的變量c屬于局部作用域杆故,在bar函數(shù)之外是無(wú)法訪問(wèn)的迅箩。事實(shí)上,Python查找一個(gè)變量時(shí)會(huì)按照“局部作用域”处铛、“嵌套作用域”饲趋、“全局作用域”和“內(nèi)置作用域”的順序進(jìn)行搜索.
global和nonlocal的區(qū)別
第一,兩者的功能不同撤蟆。global關(guān)鍵字修飾變量后標(biāo)識(shí)該變量是全局變量奕塑,對(duì)該變量進(jìn)行修改就是修改全局變量,而nonlocal關(guān)鍵字修飾變量后標(biāo)識(shí)該變量是上一級(jí)函數(shù)中的局部變量家肯,即嵌套作用域龄砰,如果上一級(jí)函數(shù)中不存在該局部變量,nonlocal位置會(huì)發(fā)生錯(cuò)誤(最上層的函數(shù)使用nonlocal修飾變量必定會(huì)報(bào)錯(cuò))讨衣。
第二寝贡,兩者使用的范圍不同扒披。global關(guān)鍵字可以用在任何地方,包括最上層函數(shù)中和嵌套函數(shù)中圃泡,即使之前未定義該變量碟案,global修飾后也可以直接使用显拜,而nonlocal關(guān)鍵字只能用于嵌套函數(shù)中坎藐,并且外層函數(shù)中定義了相應(yīng)的局部變量,否則會(huì)發(fā)生錯(cuò)誤(見(jiàn)第一)胚鸯。