首頁 >後端開發 >Python教學 >為什麼在循環中創建的函數有時會傳回錯誤的值?

為什麼在循環中創建的函數有時會傳回錯誤的值?

Linda Hamilton
Linda Hamilton原創
2024-12-27 18:11:15375瀏覽

Why Do Functions Created in Loops Sometimes Return the Wrong Values?

處理循環中的函數建立:後期綁定故障排除

嘗試在循環中建立函數時,會出現一個常見問題。在提供的範例中,目標是產生分別傳回 0、1 和 2 的三個函數。然而,所有三個函數最終都會傳回相同的值 (2)。發生這種情況是由於後期綁定,其中函數將對變數「i」的評估推遲到最後可能的時刻。

了解後期綁定

在沒有修復的程式碼中:

for i in range(3):
    def f():
        return i

每個「f」都會找出'i' 在循環循環執行的後期,此時'i' 已達到其最終值2。因此,儘管循環打算創建返回 0、1 和 2 的函數,但所有三個函數都傳回 2。

解決問題

這個問題的解決方案是儘早強制執行綁定。這可以透過將“i”作為參數傳遞給“f”函數來實現,如下所示:

for i in range(3):
    def f(i=i):
        return i

在此更新的程式碼中,當執行循環時,在定義時查找“i”而不是在執行“f”時的調用時。

使用替代解決方案閉包

另一種方法是使用閉包建立「函數工廠」:

def make_f(i):
    def f():
        return i
    return f

在循環內,可以使用'f = make_f 創建'f' (我)'。這種方法也確保了早期綁定,因為函數「make_f」在定義時將「i」的值傳遞給「f」。

以上是為什麼在循環中創建的函數有時會傳回錯誤的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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