Python實戰從入門到精通第十六講——匿名函數捕獲變量值

用lambda定義了一個匿名函數,並想在定義時捕獲到某些變量的值。

先看下下面代碼的效果:

>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y

a(10)和b(10)返回的結果是什麼?如果你認爲結果是20和30,那麼你就錯了:

>>> a(10)
30
>>> b(10)
30

這其中的奧妙在於lambda表達式中的x是一個自由變量, 在運行時綁定值,而不是定義時就綁定,這跟函數的默認值參數定義是不同的。 因此,在調用這個lambda表達式的時候,x的值是執行時的值。例如:

>>> x = 15
>>> a(10)
25
>>> x = 3
>>> a(10)
13

如果你想讓某個匿名函數在定義時就捕獲到值,可以將那個參數值定義成默認參數即可,就像下面這樣:

>>> x = 10
>>> a = lambda y, x=x: x + y
>>> x = 20
>>> b = lambda y, x=x: x + y
>>> a(10)
20
>>> b(10)
30

有些新手可能會不恰當的使用lambda表達式。 比如,通過在一個循環或列表推導中創建一個lambda表達式列表,並期望函數能在定義時就記住每次的迭代值。例如:

>>> funcs = [lambda x: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
4
4
4
4
4

但是實際效果是運行是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

 

發佈了367 篇原創文章 · 獲贊 188 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章