1. 程式人生 > >關於Python中的閉包

關於Python中的閉包

轉載請註明出處:http://blog.csdn.net/dongdong9223/article/details/83901289
本文出自【我是幹勾魚的部落格

在Python中,內層函式引用外層函式的變數(引數也算變數),然後返回內層函式的情況,稱為閉包(Closure)。

由於返回的函式還引用了外層函式的區域性變數,所以,想要正確使用閉包,就要確保引用的區域性變數在函式返回後不能變。

舉個例子,程式碼如下:

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=%d" %f1()) print("f2=%d" %f2()) print("f3=%d" %f3())

程式碼把內層函式放到外層函式的list中,注意list元素存放的是“函式”,也就是函式的引用,而不是計算出的值。如果你認為呼叫f1(),f2()和f3()結果應該是1,4,9,那就錯了!實際結果全部都是 9。執行結果如下:

[email protected]

:~/tmp/dd# python kk.py
f1=9
f2=9
f3=9

因為list中儲存的是“函式”的引用,當count()函式返回了3個函式時,這3個函式所引用的變數 i 的值已經變成了3,在輸出就都是9,也就是3*3的結果。

如果list儲存時不儲存函式的引用,而是直接儲存值,結果就不一樣了,那樣儲存的就是確確實實的值,程式碼如下:

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=%d" %f1) print("f2=%d" %f2) print("f3=%d" %f3)

結果如下:

[email protected]:~/tmp/dd# python kk2.py
f1=1
f2=4
f3=9

注意在:

fs.append

中,如果是:

fs.append(f)

儲存的就是函式的引用。

而如果是:

fs.append(f())

儲存的就是函式的返回值。

參考:

Python 函數語言程式設計和麵向物件程式設計

python中global 和 nonlocal 的作用域