了解在循環或推導式中建立函數時的後期綁定
嘗試在循環中建立函數時,您可能會遇到以下情況:儘管期望輸出不同,但所有函數都會傳回相同的值。出現此行為的原因是後期綁定,其中變數的值在執行時解析。
Python 的後期綁定
在 Python 中,函數和 lambda 可以透過執行時預設綁定變數。這意味著調用函數時會查找其中使用的任何變數。在循環中,循環迭代器 i 稍後會被解析,到那時,它會引用循環後 i 的最終值。
例如,在以下程式碼片段中:
functions = [] for i in range(3): def f(): return i functions.append(f)
函數清單中的所有函數都引用相同的 i 值,循環結束後 i 為 2。
強制提前執行綁定
要解決此問題,您需要強制早期綁定,這確保 i 的值在函數定義時綁定。實現此目的的一種方法是使用參數的預設值,如下所示:
functions = [] for i in range(3): def f(i=i): return i functions.append(f)
透過為 i 參數提供預設值,可以強制執行早期綁定。傳遞給 f 函數的 i 值在函數定義時解析,而不是在函數執行時解析。
使用函數工廠
另一種方法是使用函數工廠來建立具有所需綁定的函數。這涉及創建一個附加函數,該函數接受要綁定的變數並傳回帶有早期綁定變數的巢狀函數:
def make_f(i): def f(): return i return f
在循環中,您可以使用f = make_f(i)來創建具有適當的早期綁定的函數。
以上是為什麼 Python 循環中的函數都會回傳相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!