理解“閉包是窮人的對象”

閉包是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。
在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。 —— 維基百科

純函數是沒有狀態的,自由變量使得它有了狀態。

舉個例子,有這樣一道題:

實現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還是一直存在。

發佈了136 篇原創文章 · 獲贊 1265 · 訪問量 117萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章