處理循環中的函數建立:後期綁定故障排除
嘗試在循環中建立函數時,會出現一個常見問題。在提供的範例中,目標是產生分別傳回 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中文網其他相關文章!