1. 程式人生 > >閉包返回函式不引用迴圈變數

閉包返回函式不引用迴圈變數

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
"""