循環中的函數和 Lambda建立異常
當嘗試在循環內產生函數時,如下面的程式碼片段所示,出現問題:
functions = [] for i in range(3): def f(): return i functions.append(f)
同樣,當使用lambda:
functions = [] for i in range(3): functions.append(lambda: i)
人們預期這些函數輸出不同的值(0、1 和2),但所有函數最終都會產生相同的值(2)。
解釋及解決方法
這種現像是由於變數綁定後期造成的。在Python函數中,變數在呼叫時解析,這表示當迴圈後呼叫函數時,i的值已經設定為2。為了修正這個問題,我們透過引入f(i=i)語法來採用早期綁定。在這裡,i 參數的預設值是在定義時建立的,從而導致早期綁定:
def f(i=i): return i
或者,使用閉包和「函數工廠」的更複雜的方法可確保早期綁定:好:
def make_f(i): def f(): return i return f
在迴圈中,我們可以使用f = make_f(i) 而不是def 語句。
以上是為什麼在 Python 循環中創建的函數都會回傳相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!