3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
嵌套函數(shù)在執(zhí)行時(shí)從父作用域查找變量,而不是在定義時(shí)查找。
編譯函數(shù)體,驗(yàn)證“自由”變量(未通過(guò)賦值在函數(shù)本身中定義),然后將閉包單元綁定到函數(shù),代碼使用索引引用每個(gè)單元格。pet_function
因此具有一個(gè)自由變量(cage
),然后將其通過(guò)一個(gè)閉合單元引用,索引為0的閉合本身指向局部變量cage
在get_petters
功能。
當(dāng)您實(shí)際調(diào)用該函數(shù)時(shí),該閉包將用于查看函數(shù)調(diào)用時(shí)cage
周圍范圍的值。這就是問(wèn)題所在。當(dāng)您調(diào)用函數(shù)時(shí),該函數(shù)已經(jīng)完成計(jì)算結(jié)果。將在在執(zhí)行過(guò)程中的一些點(diǎn)局部變量分配各的,和字符串,但在功能的結(jié)束,包含了最后一個(gè)值。因此,當(dāng)您調(diào)用每個(gè)動(dòng)態(tài)返回的函數(shù)時(shí),您將獲得打印的值。get_petters
cage
'cow'
'dog'
'cat'
cage
'cat'
'cat'
解決方法是不依賴于閉包。您可以使用部分函數(shù),創(chuàng)建新的函數(shù)作用域,或?qū)⒆兞拷壎?em>為關(guān)鍵字參數(shù)的默認(rèn)值。
部分功能示例,使用
functools.partial()
:from functools import partialdef pet_function(cage=None): print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
創(chuàng)建新范圍示例:
def scoped_cage(cage=None): def pet_function(): print "Mary pets the " + cage.animal + "." return pet_functionyield (animal, partial(gotimes, scoped_cage(cage)))
將變量綁定為關(guān)鍵字參數(shù)的默認(rèn)值:
def pet_function(cage=cage): print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, pet_function))
不需要scoped_cage
在循環(huán)中定義函數(shù),編譯只發(fā)生一次,而不是在循環(huán)的每次迭代中發(fā)生。
添加回答
舉報(bào)