Lambda 函數及其參數的範圍
Lambda 函數是匿名函數,可以捕捉其封閉函數的範圍。這允許他們從父作用域存取變數和參數。但是,當 lambda 函數使用在封閉函數內修改的參數時,此行為有時會導致意外結果。
若要說明此問題,請考慮以下程式碼:
def callback(msg):
print(msg)
# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
# Calling the lambda functions
for f in funcList:
f()
這段程式碼的預期輸出是:
do re mi
但實際輸出是:
mi mi mi
這是因為 lambda 函數從封閉範圍捕捉變數 m 的引用。當迭代器執行循環時,它在最終迭代中將值“mi”賦給 m。因此,所有 lambda 函數在執行時都會引用“mi”,即使在創建過程中向它們傳遞了不同的值。
要解決此問題,您可以在以下位置捕獲m 的值:創建lambda 函數的時間,將其用作可選參數的預設值:
for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))
這確保每個 lambda 函數都可以存取自己的 m 副本,捕獲循環迭代期間分配的值。該程式碼的輸出將是:
do re mi
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3