首頁 > 後端開發 > Python教學 > 為什麼循環中定義的函數經常會傳回相同的值,如何解決這個問題?

為什麼循環中定義的函數經常會傳回相同的值,如何解決這個問題?

DDD
發布: 2025-01-01 08:13:10
原創
841 人瀏覽過

Why Do Functions Defined in Loops Often Return the Same Value, and How Can This Be Fixed?

在循環中建立函數:解決後期綁定問題

嘗試在循環中定義單一函數時,通常會遇到以下問題:儘管旨在表示唯一的結果,但所有函數都會傳回相同的值。這種現象稱為後期綁定,發生的原因是函數在被呼叫之前不會接收其參數。

考慮以下使用 for 迴圈的範例:

functions = []
for i in range(3):
    def f():
        return i
    functions.append(f)
登入後複製

如所寫,每個函數在呼叫時找出 i 的對應值。然而,循環執行後,所有函數都會引用i (2) 的最終值,從而產生以下輸出:

print([f() for f in functions])
# Expected: [0, 1, 2]
# Actual: [2, 2, 2]
登入後複製

解決方案:強制早期綁定

為了解決這個問題,有必要透過在定義時而不是呼叫時將參數分配給函數來強制早期綁定。這可以透過在函數定義中新增預設參數來實現:

functions = []
for i in range(3):
    def f(i=i):
        return i
    functions.append(f)
登入後複製

預設參數(在本例中為 i=i)在定義函數時計算,而不是在呼叫函數時計算。這確保每個函數保留其唯一的參數值,產生所需的輸出:

print([f() for f in functions])
# Output: [0, 1, 2]
登入後複製

使用閉包的替代方法

如果擔心可能存在其他參數要傳遞給函數,可以使用閉包實現更複雜的方法:

def make_f(i):
    def f():
        return i
    return f
登入後複製

在這種情況下,建立函數工廠(make_f)。在迴圈內,make_f 傳回的函數被指派給 f 變量,而不是直接呼叫 def f():。這種方法保證每個函數保留其獨佔的參數值,就像早期的綁定解決方案一樣。

以上是為什麼循環中定義的函數經常會傳回相同的值,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板