首頁 >後端開發 >Python教學 >為什麼 Python 循環中的函數都會回傳相同的值?

為什麼 Python 循環中的函數都會回傳相同的值?

Susan Sarandon
Susan Sarandon原創
2024-12-20 16:22:10751瀏覽

Why Do My Functions in a Python Loop All Return the Same Value?

了解在循環或推導式中建立函數時的後期綁定

嘗試在循環中建立函數時,您可能會遇到以下情況:儘管期望輸出不同,但所有函數都會傳回相同的值。出現此行為的原因是後期綁定,其中變數的值在執行時解析。

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

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