對於Python閉包的理解

2022-09-05 07:12:15 字數 979 閱讀 5847

首先看乙個面試中非常常見的題目

def num():

return [lambda x: x * i for i in range(4)]

print([ n(2) for n in num()])

先看一下num函式的作用,定義了乙個匿名函式,返回傳入引數乘以列表生成式的每乙個元素,所以乍一看結果應該為[0,2,4,6],如果這樣想的話就落入陷阱了。這個題目考察的就是在python中閉包是延遲繫結的,當num()賦值給n的時候就已經完成for迴圈了,i已經等於3,所以到最後輸出值都為 2 *3 也就是[6,6,6,6]

閉包就是在乙個外部函式中定義乙個內函式,內函式裡運用了外部函式的臨時變數,並且外函式的返回值是內函式的引用。如下是最簡單的乙個閉包:

在python中一切皆物件,小到乙個變數,大到乙個函式乙個類都是物件,變數名,函式名類名都是指向記憶體位址。因此當返回值為乙個函式的引用的時候可以跟括號來呼叫此函式。

一般來說,當乙個函式結束的時候,會將臨時變數釋放掉,但是在閉包中,臨時變數會在內部函式中用到,因此在返回內函式的時候會將臨時變數和內函式繫結在一起,外函式結束後,在呼叫內函式的時候依然可以使用外函式的臨時變數。每次在呼叫外函式的時候都會在記憶體中建立乙個內函式,並且返回的是當前的內函式位址,需要知道的的是雖然內函式被重新建立了,但是外函式的臨時變數只存在乙份,每次建立的內函式都是使用的同乙份臨時變數。如下兩次呼叫的返回值是不同的

python中內函式想要修改外函式的臨時變數可以使用nonlocal關鍵字來定義變數,如下:

Python中對於閉包函式的理解

閉包的本質還是函式,之所以將它和函式放在一起,是因為閉包首先要滿足函式的巢狀,其次,內部函式必須要對外部函式中的變數有引用,這樣便構成了乙個閉包。1 函式巢狀,至少有倆個函式巢狀。多層函式巢狀的話,呼叫變數滿足依賴倒置原則。2 內部函式對外部函式中的臨時變數有引用,或者說呼叫。a 2 def out...

對於閉包我的理解

閉包這個概念以前看過幾次,不是很理解,今天在菜鳥上又看了一遍,覺得自己好像理解了。在此記下。其實,我覺得可以把閉包理解為為了解決計數器問題的乙個方法吧。什麼是計數器問題呢?就是說,我要建立乙個計數器函式,這個函式每執行一次,計數器就加1。聽起來很簡單。於是就有人開始寫函式。寫函式為了儲存你執行函式的...

python閉包怎麼理解 Python 閉包的理解

很多函式型的語言都有閉包這一概念,比如python的兄弟js。人們剛聽到閉包這一概念總會覺得它很晦澀,難以理解。其實不然,主要是他的名字起得太抽象了,讓人誤以為很難。下面舉乙個例子 coding utf 8 def foo nums 0 5 for i in range 5 nums i lambd...