閉包迷思

起因于慕課上的一段代碼:

# 希望一次返回3個(gè)函數(shù)碴里,分別計(jì)算1x1,2x2,3x3:

def count():

? ? fs = []

? ? for i in range(1, 4):

? ? ? ? def f():

? ? ? ? ? ? return i*i

? ? ? ? fs.append(f)

? ? return fs

f1, f2, f3 = count()

print f1,f2,f3 >>> 9, 9, 9

要求正常實(shí)現(xiàn)功能捉蚤,看不明白……在評論區(qū)抄了一段:

def count():

? ? fs = []

? ? for i in range(1, 4):

? ? ? ? def f(m = i):

? ? ? ? ? ? return m * m

? ? ? ? fs.append(f)

? ? return fs

f1, f2, f3 = count()

print f1(), f2(), f3() >>> 1, 4, 9

媳危?烦周?帚稠?

繼續(xù)看評論:

問題的產(chǎn)生是因?yàn)楹瘮?shù)只在執(zhí)行時(shí)才去獲取外層參數(shù)i孵运,若函數(shù)定義時(shí)可以獲取到i穆律,問題便可解決惠呼。而默認(rèn)參數(shù)正好可以完成定義時(shí)獲取i值且運(yùn)行函數(shù)時(shí)無需參數(shù)輸入的功能,所以在函數(shù)f()定義中改為f(m = i),函數(shù)f返回值改為m*m即可.

好像懂了又好像沒懂峦耘。

大概就是count()返回了fs剔蹋,其中保存了3個(gè)沒有執(zhí)行過的f,分別賦予變量f1,f2,f3

在開始的那段代碼中辅髓,返回3個(gè)f時(shí)i已經(jīng)變成3泣崩,這時(shí)再調(diào)用就會出現(xiàn)f(3),f(3)洛口,f(3) = 9矫付,9,9

而第二段代碼中第焰,每次返回f時(shí)當(dāng)前的i被固定在了變量m中买优,因此調(diào)用時(shí)為f(1),f(2),f(3) = 1杀赢,4烘跺,9

換言之,讓fs中直接保存每次循環(huán)中執(zhí)行的結(jié)果也可以達(dá)到目的:

def count3():

? ? fs = []

? ? for i in range(1,4):

? ? ? ? fs.append(i*i)

? ? return fs

f1, f2, f3 = count3()

print f1, f2, f3 >>> 1, 4, 9

最后看看課程中對此的結(jié)論:

像這種內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量)脂崔,然后返回內(nèi)層函數(shù)的情況滤淳,稱為閉包(Closure)

閉包的特點(diǎn)是返回的函數(shù)還引用了外層函數(shù)的局部變量砌左,所以娇钱,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變绊困。

因此文搂,返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會發(fā)生變化的變量秤朗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤蹭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子取视,更是在濱河造成了極大的恐慌硝皂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作谭,死亡現(xiàn)場離奇詭異稽物,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)折欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門贝或,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锐秦,你說我怎么就攤上這事咪奖。” “怎么了酱床?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵羊赵,是天一觀的道長。 經(jīng)常有香客問我扇谣,道長昧捷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任罐寨,我火速辦了婚禮靡挥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衩茸。我一直安慰自己芹血,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布楞慈。 她就那樣靜靜地躺著幔烛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囊蓝。 梳的紋絲不亂的頭發(fā)上饿悬,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音聚霜,去河邊找鬼狡恬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝎宇,可吹牛的內(nèi)容都是我干的弟劲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼姥芥,長吁一口氣:“原來是場噩夢啊……” “哼兔乞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凉唐,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庸追,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后台囱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淡溯,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年簿训,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咱娶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡强品,死狀恐怖豺总,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择懂,我是刑警寧澤喻喳,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站困曙,受9級特大地震影響表伦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慷丽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一蹦哼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧要糊,春花似錦纲熏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺拣。三九已至,卻和暖如春鱼填,著一層夾襖步出監(jiān)牢的瞬間药有,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工苹丸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愤惰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓赘理,卻偏偏與公主長得像宦言,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子商模,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容