關於Python中的閉包
阿新 • • 發佈:2018-11-27
轉載請註明出處: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。執行結果如下:
:~/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())
儲存的就是函式的返回值。