首頁  >  文章  >  後端開發  >  如何避免 Lambda 函數中的參數修改導致意外結果

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

Patricia Arquette
Patricia Arquette原創
2024-10-19 17:28:01684瀏覽

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn