」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何避免 Lambda 函數中的參數修改導致意外結果

如何避免 Lambda 函數中的參數修改導致意外結果

發佈於2024-11-18
瀏覽:372

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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
版本聲明 本文轉載於:1729329919如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3