Python中lambda的小坑

2021-10-20 19:31:02 字數 1252 閱讀 4902

python lambda函式的行為可能有點反直覺,例如在一些包含迴圈的情況中。要深入理解這些行為,需要搞清楚python中的變數到底什麼時候繫結的。

下面看看常規函式和lambda的例子。

1>>> def wrap(n):

2... def f():

3... print(n)

4... return f

5...

6>>> numbers = 'one', 'two', 'three'

7>>> funcs =

8>>> for n in numbers:

10...

11>>> for f in funcs:

12... f()

13...

14one

15two

16three

上面**是常規函式,引數n是在第9行的時候求值並繫結的,也就是說這個wrap函式的返回值(f),被加入到funcs中的時候一定就已經確定了。

現在我們用lambda把上面的邏輯再擼一遍,看看它作什麼妖。

1>>> numbers = 'one', 'two', 'three'

2>>> funcs =

3>>> for n in numbers:

5...

6>>> for f in funcs:

7... f()

8...

9three

10three

11three

結果大不同。變數n的值,在lambda真正執行的時候才求值。所以n的值是"three"。在第4行的lambda函式會生成乙個閉包,而n作為乙個自由變數,在執行時才繫結到這個閉包上。

要想解決這個晚繫結的問題,可以用下面的方式將自由變數(free variable)賦值到lambda的引數,這裡的引數n的預設值是變數n,而python中預設引數是早繫結的。

1>>> numbers = 'one', 'two', 'three'

2>>> funcs =

3>>> for n in numbers:

5...

6>>> for f in funcs:

7... f()

8...

9one

10two

11three

每天學一點,進步每一天~~ 

文中的例子來自 : 

關於python中lambda 函式使用小結

例子 如果定義普通函式,一般都是這樣寫 def ds x return 2 x 1 呼叫即 ds 5 如果用lambda函式就是這麼寫,就是一句話 g lambda x 2 x 1 呼叫 g 5 以這樣認為,lambda作為乙個表示式,定義了乙個匿名函式,冒號左邊x為入口引數,右邊x 1為函式體 計...

Python中的Lambda表示式小析

lambda表示式在python中經常使用到,在此總結下lambda表示式的常用方法。首先,要明白lambda表達在python中是作為乙個匿名函式的構造器而存在。其次,要明白lambda表示式的常用場景是lambda表示式對應函式的使用次數非常有限 因此,沒有必要專門定義乙個非匿名函式 同時保證了...

Python中的lambda形式

python中的lambda語句被用來建立新的函式物件,並且在執行時返回它們。注意 1 下面的例子使用make repeater函式在執行時,通過lambda語句來建立新的函式物件,並且返回它。在這裡,lambda需要乙個引數,後面僅跟單個表示式作為函式體,而表示式的值被這個新建的函式返回。2 注意...