Lambda 函數及其參數的範圍
Lambda 函數是匿名函數,可以捕捉其封閉函數的範圍。這允許他們從父作用域存取變數和參數。但是,當 lambda 函數使用在封閉函數內修改的參數時,此行為有時會導致意外結果。
為了說明問題,請考慮以下程式碼:
<code class="python">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()</code>
預期的結果此程式碼的輸出是:
do re mi
但是,實際輸出是:
mi mi mi
這是因為lambda 函數從封閉範圍捕獲對變數m 的引用。當迭代器執行循環時,它在最終迭代中將值“mi”賦給 m。因此,所有 lambda 函數在執行時都會引用“mi”,即使在創建過程中向它們傳遞了不同的值。
要解決此問題,您可以在以下位置捕獲m 的值:創建lambda 函數時,將其用作可選參數的預設值:
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
這確保每個lambda 函數都可以存取自己的m 副本,捕捉在建立過程中指派的值循環迭代。此程式碼的輸出將是:
do re mi
以上是如何避免 Lambda 函數中的參數修改導致意外結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!