Python中使用列表生成式生成多個(gè)lambda函數(shù)

1匾二、我們使用列表生成式來(lái)生成多個(gè)匿名函數(shù)

for fun in [lambda x:x*i for i in range(3)]:
    print fun(2)

我們期望的返回結(jié)果是:

0
2
4

但是實(shí)際的返回結(jié)果是:

4
4
4

為什么最后生成的函數(shù)都是使用i=2這個(gè)值。
2嚼锄、我們使用函數(shù)來(lái)生成匿名函數(shù)

def create_fun(i):
    return lambda :i

a_list = [create_fun(i) for i in range(3)]
b_list = [lambda :i for i in range(3)]

print a_list[0]()
print b_list[0]()
# 0
# 2

從上面的代碼可以看出亡蓉,使用函數(shù)生成的匿名函數(shù)使用的i變量是我們預(yù)期的值录豺,這是為什么呢煤傍?
我們看一下運(yùn)行時(shí)的過(guò)程:

我們從圖中可以看到盖文,使用函數(shù)生成的匿名函數(shù)中都一個(gè)變量i和值的綁定,但是在列表生成式中生成的函數(shù)就沒(méi)有和值進(jìn)行綁定蚯姆。
再來(lái)看一個(gè)例子:

def foo():
    print var

if  __name__ == '__main__':
  foo()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-624891b0d01a> in <module>()
----> 1 foo()

<ipython-input-1-a40eeee590ab> in foo()
      1 def foo():
----> 2     print var
      3 

NameError: global name 'var' is not defined
程序會(huì)輸入這樣的異常五续,說(shuō)var這個(gè)變量沒(méi)有定義,就是在python函數(shù)定義的時(shí)候龄恋,var變量只是個(gè)變量疙驾,并沒(méi)有和值綁定,只有在調(diào)用的時(shí)候才會(huì)去查找這個(gè)變量郭毕,我們?cè)趫?zhí)行函數(shù)的時(shí)候由于沒(méi)有找到這個(gè)變量的值就報(bào)錯(cuò)了
var = 12
foo()
12

所以上面使用列表生成式生成的匿名函數(shù)中它碎,i變量并沒(méi)有在函數(shù)定義的時(shí)候就和i變量的值綁定而是在調(diào)用的時(shí)候去查找i的值,這個(gè)時(shí)候由于i已經(jīng)執(zhí)行變成2,所以調(diào)用匿名函數(shù)扳肛,看到的i變量的值都是2偏竟,這也就是為什么所有的函數(shù)打印的結(jié)果都是一樣的原因。
3敞峭、解決方法
我們?cè)诙x匿名函數(shù)的時(shí)候可以顯示的給它一個(gè)默認(rèn)參數(shù)

for fun in [lambda x,i=i:x*i for i in range(3)]:
    print fun(2)
0
2
4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝉仇,隨后出現(xiàn)的幾起案子旋讹,更是在濱河造成了極大的恐慌,老刑警劉巖轿衔,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沉迹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡害驹,警方通過(guò)查閱死者的電腦和手機(jī)鞭呕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宛官,“玉大人葫松,你說(shuō)我怎么就攤上這事〉紫矗” “怎么了腋么?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亥揖。 經(jīng)常有香客問(wèn)我珊擂,道長(zhǎng),這世上最難降的妖魔是什么费变? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任摧扇,我火速辦了婚禮,結(jié)果婚禮上挚歧,老公的妹妹穿的比我還像新娘扛稽。我一直安慰自己,他們只是感情好滑负,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布庇绽。 她就那樣靜靜地躺著,像睡著了一般橙困。 火紅的嫁衣襯著肌膚如雪瞧掺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天凡傅,我揣著相機(jī)與錄音辟狈,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哼转,可吹牛的內(nèi)容都是我干的明未。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼壹蔓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趟妥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起佣蓉,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤披摄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勇凭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疚膊,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年虾标,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寓盗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡璧函,死狀恐怖傀蚌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蘸吓,我是刑警寧澤喳张,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站美澳,受9級(jí)特大地震影響销部,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜制跟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一舅桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雨膨,春花似錦擂涛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至排监,卻和暖如春狰右,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舆床。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工棋蚌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁佳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓谷暮,卻偏偏與公主長(zhǎng)得像蒿往,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湿弦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理瓤漏,服務(wù)發(fā)現(xiàn),斷路器颊埃,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù)蔬充,函數(shù)就是值。所有函數(shù)都消費(fèi)函數(shù)竟秫,...
    JackChen1024閱讀 5,952評(píng)論 1 17
  • 前言 人生苦多,快來(lái) Kotlin 跷乐,快速學(xué)習(xí)Kotlin肥败! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,146評(píng)論 9 118
  • 這個(gè)世界纽谒, 對(duì)著你笑的人太多太多。 真心包容你的如输, 太少太少鼓黔。 不后悔,莫過(guò)于做好三件事: 一是知道如何選擇不见; 二...
    西廊墨河閱讀 264評(píng)論 1 0
  • 有沒(méi)有那么一瞬間澳化,你被自己感動(dòng)過(guò)? 下面兩張照片是我在青島西海岸半程馬拉松比賽中最后100米沖刺時(shí)攝影...
    破曉時(shí)刻閱讀 409評(píng)論 0 2