如果在一個內部函數裏,對在外部作用域(但不是在全局作用域)的變量進行引用,那麼內部函數就被認爲是閉包。(簡單說這個外部作用域的變量就是自由變量)
閉包將內部函數自己的代碼和作用域以及外部函數的作用域結合起來。
閉包的詞法變量不屬於全局名稱空間域或者局部的------而屬於其他的名稱空間,帶着“流浪”的作用域。
>>> def make_addr(assend):
def adder(gugend):
return assend+gugend
return adder
>>> p=make_addr(23)
>>> q=mkde_addr(44)
>>> print(p(100))
123
>>> print(q(100))
144
分析一下:
我們發現,make_adder是一個函數,包括一個參數assend,比較特殊的地方是這個函數裏面又定義了一個新函數,這個新函數裏面的一個變量正好是外部make_adder的參數.也就是說,外部傳遞過來的assend參數已經和adder函數綁定到一起了,形成了一個新函數,我們可以把assend看做新函數的一個配置信息,配置信息不同,函數的功能就不一樣了,也就是能得到定製之後的函數.
再看看運行結果,我們發現,雖然p和q都是make_adder生成的,但是因爲配置參數不同,後面再執行相同參數的函數後得到了不同的結果.這就是閉包.
<function counter.<locals>.incr at 0x03003660>
>>> def counter(start_at = 0):
count = [start_at]
def incr():
count[0] +=1
return count[0]
return incr
>>> count = counter(5)
>>> print(count)
<function counter.<locals>.incr at 0x03003618> 我的程序在執行的時候就會報這個錯。各種百度都找不到錯誤啊。上面的代碼完全是照着書敲的啊,看來書上也有錯誤呢。
>>> def counter(start_at = 0):
count = [start_at]
def incr():
return count[0]+1
return incr()
>>> c=counter(7)
>>> print(c)
8
眼尖的看出是什麼原因了麼??