為什麼在迴圈中使用不同值的 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
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP