為什麼在迴圈中使用不同值的 Python lambda 函式都返回相同的結果?


在瞭解為什麼在迴圈中使用不同值的 Python lambda 函式都返回相同的結果之前,讓我們先了解一下 Lambda。

Python Lambda

Lambda 表示式允許定義匿名函式。Lambda 函式是一個匿名函式,即沒有名稱的函式。讓我們看看語法:

lambda arguments: expressions

關鍵字 lambda 定義了一個 lambda 函式。lambda 表示式包含一個或多個引數,但只能有一個表示式。

示例

讓我們看一個例子

myStr = "Thisisit!" (lambda myStr : print(myStr))(myStr)

輸出

Thisisit!

Python lambdas 在迴圈中使用不同的值,但都返回相同的結果

現在讓我們瞭解一下為什麼在迴圈中使用不同值的 Python lambda 函式都返回相同的結果。

假設我們要找到平方。使用 for 迴圈定義一些不同的 lambda 函式:

squares = [] for a in range(5): squares.append(lambda: a**2)

這將為您提供一個包含 5 個 lambda 函式的列表,這些函式計算 a**2。呼叫時,它們應該返回 0、1、4、9 和 16。但是,實際上它們都返回 16,如下所示:

squares = [] for a in range(5): squares.append(lambda: a**2) print(squares[2]())

輸出

16

現在,嘗試使用其他值執行它。它會給出相同的結果:

squares = [] for a in range(5): squares.append(lambda: a**2) print(squares[4]())

輸出

16

您得到類似的輸出,因為 x 不是 lambda 函式的區域性變數,而是在外部作用域中定義的,並且在呼叫 lambda 函式時訪問它,而不是在定義時訪問它。

在迴圈結束時,x 的值為 4,因此所有函式現在都返回 4**2,即 16。透過更改 x 的值並檢視 lambda 函式的輸出如何變化來驗證這一點:

squares = [] for a in range(5): squares.append(lambda: a**2) a = 8 print(squares[2]())

為了避免這種情況,將值儲存在 lambda 函式的區域性變數中,這樣它們就不會依賴於全域性變數 a 的值:

squares = [] for a in range(5): squares.append(lambda n=a: n**2)

這裡,n=x 建立了一個新的區域性變數 n,並在定義 lambda 函式時計算,以便它具有 a 在迴圈中該點處的相同值。這意味著第一個 lambda 函式中 n 的值為 0,第二個為 1,第三個為 2,依此類推。

因此,每個 lambda 函式現在都將返回正確的結果:

squares = [] for a in range(4): squares.append(lambda n=a: n**2) print(squares[2]())

輸出

4

讓我們看看其他一些值:

squares = [] for a in range(5): squares.append(lambda n=a: n**2) print(squares[4]())

輸出

16

更新於: 2022-09-19

75 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.