def?count():
????fs?=?[]
????for?i?in?range(1,?4):
????????def?f(j):
????????????def?g():
????????????????return?j*j
????????????return?g
????????r=f(i)
????????fs.append(r)
????return?fs
f1,f2,f3=count()
print?f1(),?f2(),?f3()
1 回答

Iamxiaoq
TA貢獻(xiàn)33條經(jīng)驗(yàn) 獲得超6個(gè)贊
閉包問題,首先,你得先明白在python里面,一切皆對(duì)象,函數(shù)也是一個(gè)對(duì)象。
在函數(shù)這個(gè)對(duì)象里面有一個(gè)特殊的屬性,那就是__closure__,這是函數(shù)的一個(gè)閉包屬性(姑且這么叫吧),用來存儲(chǔ)其引用的外層函數(shù)的變量,該屬性在定義的時(shí)候創(chuàng)建,而不是執(zhí)行時(shí)??磮D
然后再理解一下代碼應(yīng)該沒多大問題了
def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????def?f(j): ????????????def?g(): ????????????????#?return?__closure__[0].cell_contents?*?__closure__[0].cell_contents ????????????????return?j*j? ????????????return?g ????????#?執(zhí)行f(i)返回創(chuàng)建函數(shù)g返回,此時(shí)g.__closure__[0].cell_contents存儲(chǔ)的就是i的值 ????????#?[g.__closure__[0].cell_contents=1,?g.__closure__[0].cell_contents=2,?g.__closure__[0].cell_contents=3] ????????r?=?f(i)? ????????fs.append(r) ????return?fs f1,f2,f3=count() print?f1(),?f2(),?f3()
水平有限,只能解釋成這樣了。
添加回答
舉報(bào)
0/150
提交
取消