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貢獻33條經驗 獲得超6個贊
閉包問題,首先,你得先明白在python里面,一切皆對象,函數也是一個對象。
在函數這個對象里面有一個特殊的屬性,那就是__closure__,這是函數的一個閉包屬性(姑且這么叫吧),用來存儲其引用的外層函數的變量,該屬性在定義的時候創建,而不是執行時。看圖
然后再理解一下代碼應該沒多大問題了
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 ????????#?執行f(i)返回創建函數g返回,此時g.__closure__[0].cell_contents存儲的就是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()
水平有限,只能解釋成這樣了。
添加回答
舉報
0/150
提交
取消