Python基礎之閉包函式

純真zwj發表於2019-03-11

閉包的概念

在 Python 中很多地方都會使用到閉包,那麼究竟什麼叫做閉包呢? 在維基百科上是這麼解釋的。

在一些語言中,在函式中可以(巢狀)定義另一個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在一個函式與一組“私有”變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。——
維基百科

簡而言之, 閉包的特點就是內部函式引用了外部函式中的變數。 在Python中,支援將函式當做物件使用,也就是可以將一個函式當做普通變數一樣用作另一個函式的引數和返回值。擁有此類特性的語言,一般都支援閉包。

閉包中被內部函式引用的變數,不會因為外部函式結束而被釋放掉,而是一直存在記憶體中,知道內部函式被呼叫結束。

閉包例項

def func():
    name = 'python'
    def inner():
        print(name)
    return inner

f = func()  # f = func() = inner 
f()  # f() = inner 
# 輸出結果:python

因為作用域的原因,在函式外部就無法拿到函式中的變數和內部函式。通常我們需要使用函式中的變數時,才去將變數返回的辦法。同理,在使用內部函式時,我們也可以將函式名作為返回值返回。 這是閉包最常用的方式。

如何判斷是否是閉包函式

函式名.__closure__ 在函式是閉包函式時,返回一個cell元素;不是閉包時,返回None。
輸出cell:

def func():
    name = 'python'
    def inner():
        print(name)
    print(inner.__closure__)  # (<cell at 0x0000027C14EB85E8: str object at 0x0000027C14F54960>,)
    return inner

f = func()
f()

輸出None:

name = 'python'
def func():
    def inner():
        print(name)
    print(inner.__closure__)  # None
    return inner

f = func()
f()

相關文章