」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何避免在lambda函數範圍和循環中參數中的意外行為?

如何避免在lambda函數範圍和循環中參數中的意外行為?

發佈於2025-03-24
瀏覽:602

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

考慮以下代碼,該代碼旨在為GUI事件創建呼叫的列表: 打印味精 #使用迭代器的方法不正確 funclist = [] 對於m in('do','re','mi'): Funclist.Append(Lambda:Callback(M)) #正確創建一個方法 funclist = [] Funclist.Append(lambda:callback('do')) Funclist.Append(lambda:callback('re')) Funclist.Append(Lambda:Callback('Mi')) #執行回調功能 對於F Funclist的F: f()

執行時,代碼出乎意料地打印: mi mi 做 關於 mi

,而不是預期的輸出:

理解lambda函數及其參數的範圍至關重要。與常規功能不同,lambda功能引用了創建它們的周圍環境。該引用包括Lambda主體內使用的變量。

在不正確的方法中使用迭代器時,對於循環中的每個元素m,它會創建一個新的lambda函數,引用相同的變量m。但是,循環完成後,變量m引用循環中的最後一個元素,即“ mi”。因此,當執行回調函數時,它們都使用更新的引用。 解決此問題的解決方案可以捕獲lambda函數的lambda函數的值for IT作為deveault of optional參數(a optional參數),我們可以捕獲lambda函數的值

。 're','mi'): Funclist.Append(lambda m = m:callback(m))

現在,在每個lambda函數中,m被捕獲為局部變量,並且在循環完成時將其值保留。因此,當執行回調函數時,它們會打印正確的值,從而產生預期的輸出。

版本聲明 本文轉載於:1729329977如有侵犯,請聯繫[email protected]刪除
最新教學 更多>

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

Copyright© 2022 湘ICP备2022001581号-3