亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這樣的代碼執行后fs=[f(1),f(2),f(3)]嗎

這樣的代碼執行后fs=[f(1),f(2),f(3)]嗎

stefan71 2016-11-26 11:29:03
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__,這是函數的一個閉包屬性(姑且這么叫吧),用來存儲其引用的外層函數的變量,該屬性在定義的時候創建,而不是執行時。看圖

http://img1.sycdn.imooc.com//583d7aa20001972c04890263.jpg

然后再理解一下代碼應該沒多大問題了

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()

水平有限,只能解釋成這樣了。

查看完整回答
反對 回復 2016-11-29
  • 1 回答
  • 0 關注
  • 1656 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號