python中對閉包的理解(2)
阿新 • • 發佈:2018-11-22
上一篇介紹了閉包的概念,這一篇介紹下閉包的使用過程中需要注意的問題。
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()) print(f2()) print(f3())
執行結果:
9
9
9
上述程式碼中,每次迴圈返回函式f,其中儲存了變數i,迴圈結束後返回了三個函式,此時i變成了3,此時再去執行三個函式時,都會返回3*3=9,所以閉包中的返回函式不要引用後續會發生變化的變數。
如果一定要引用迴圈中的變數,可以再定義一個函式,把結果儲存在該函式返回值中,後續變數發生變化,該函式裡的結果不會變化
def count(): fs = [] def f(j): def g(): return j*j return g for i in range(1,4): fs.append(f(i)) #此時執行了函式f(i),所以i的當前值被傳入並把函式執行結果儲存在函式g中。 return fs
f1, f2, f3 = count() print(f1()) print(f2()) print(f3())
執行結果:
1
4
9