閉包返回函式不引用迴圈變數
阿新 • • 發佈:2018-12-19
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() """ print f1() ---> 9 print f2() ---> 9 print f3() ---> 9 """ # 全部都是9! 原因就在於返回的函式引用了變數i,但它並非立刻執行。等到3個函式都返回時,它們所引用的變數i已經變成了3,因此最終結果為9 # 返回閉包時牢記一點:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。 # 如果一定要引用迴圈變數怎麼辦?方法是再建立一個函式,用該函式的引數繫結迴圈變數當前的值,無論該迴圈變數後續如何更改,已繫結到函式引數的值不變: def count(): def f(j): return j*j fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被執行,因此i的當前值被傳入f() return fs f4,f5,f6 = count() """ print f4 ---> 1 print f5 ---> 4 print f6 ---> 9 """