閉包是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。
在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。 —— 維基百科
純函數是沒有狀態的,自由變量使得它有了狀態。
舉個例子,有這樣一道題:
實現counter ,使得調用結果如下:
c1 = counter(10)
c2 = counter(20)
print c1(), c2(), c1(), c2()
outputs :
11 21 12 22
要實現這個目的,那麼要有狀態,自然而然會想到用面向對象。
class counter:
def __init__(self, x):
self.x = x
def __call__(self):
self.x += 1
return self.x
c1 = counter(10)
c2 = counter(20)
print c1(), c2(), c1(), c2()
如果不使用對象呢?使用閉包,可以使得函數也有了狀態,達到同樣的目的。
def counter(x):
a = [x]
def inner():
a[0] += 1
return a[0]
return inner
c1 = counter(10)
c2 = counter(20)
print c1(), c2(), c1(), c2()
可以看到,即使離開了counter函數,變量a還是一直存在。