W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你用lambda定義了一個(gè)匿名函數(shù),并想在定義時(shí)捕獲到某些變量的值。
先看下下面代碼的效果:
>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y
>>>
現(xiàn)在我問你,a(10)和b(10)返回的結(jié)果是什么?如果你認(rèn)為結(jié)果是20和30,那么你就錯(cuò)了:
>>> a(10)
30
>>> b(10)
30
>>>
這其中的奧妙在于lambda表達(dá)式中的x是一個(gè)自由變量,在運(yùn)行時(shí)綁定值,而不是定義時(shí)就綁定,這跟函數(shù)的默認(rèn)值參數(shù)定義是不同的。因此,在調(diào)用這個(gè)lambda表達(dá)式的時(shí)候,x的值是執(zhí)行時(shí)的值。例如:
>>> x = 15
>>> a(10)
25
>>> x = 3
>>> a(10)
13
>>>
如果你想讓某個(gè)匿名函數(shù)在定義時(shí)就捕獲到值,可以將那個(gè)參數(shù)值定義成默認(rèn)參數(shù)即可,就像下面這樣:
>>> x = 10
>>> a = lambda y, x=x: x + y
>>> x = 20
>>> b = lambda y, x=x: x + y
>>> a(10)
20
>>> b(10)
30
>>>
在這里列出來的問題是新手很容易犯的錯(cuò)誤,有些新手可能會(huì)不恰當(dāng)?shù)膌ambda表達(dá)式。比如,通過在一個(gè)循環(huán)或列表推導(dǎo)中創(chuàng)建一個(gè)lambda表達(dá)式列表,并期望函數(shù)能在定義時(shí)就記住每次的迭代值。例如:
>>> funcs = [lambda x: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
4
4
4
4
4
>>>
但是實(shí)際效果是運(yùn)行是n的值為迭代的最后一個(gè)值?,F(xiàn)在我們用另一種方式修改一下:
>>> funcs = [lambda x, n=n: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
0
1
2
3
4
>>>
通過使用函數(shù)默認(rèn)值參數(shù)形式,lambda函數(shù)在定義時(shí)就能綁定到值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: