1. 程式人生 > >python中對閉包的理解(2)

python中對閉包的理解(2)

上一篇介紹了閉包的概念,這一篇介紹下閉包的使用過程中需要注意的問題。

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