Python學習筆記 閉包

2021-08-04 04:07:40 字數 1698 閱讀 6616

在學習閉包之前,我們先要弄懂一件事兒。

同理:

test其實就是乙個變數,變數中存放著函式體的位址,就像a變數中存放著100的位址一樣。

t = test實質上就是淺拷貝行為。將變數test中的位址存放到變數t中

我們如果要呼叫test函式,test()

當t獲取了函式體的位址後,同樣可以以t()的形式呼叫函式

!!!注意:這裡可以結合之前的深拷貝淺拷貝知識。驗證一些東西。

請看下圖:

這裡我深拷貝了test,發現拷貝完了以後s和test的id也就是裡面存放著位址是相同的。根據之前的知識點,在進行深拷貝時,當位址對應的空間中存放著不可變型別資料的時候,自動轉換為淺拷貝。

由此可知,函式體本身就是不可變資料型別。

了解以上機制以後接下來我們來看今天的內容——閉包

先看一段**:

閉包是什麼?

乙個函式體內還有另外乙個函式體,內函式體中用到了外函式體的變數,這時候我們就稱內函式是乙個閉包。

就像上面**中寫的一樣,內函式體test_in中用到了外函式體test中的變數num

所以我們稱test_in是閉包。

仔細觀察**,結合我們剛才的預習,寫出下列結果/含義:

t = test

t1 = t(100)

t2 = test(100)

t(100)

(50)

t1(50)

下面我們依次解析一下

t = test 在我們預習的時候就講過了,其實是把test所對應的函式體的位址給了t(淺拷貝)

t1 = t(100)和t2 = test(100) 因為t和test指向同乙個函式體,所以呼叫函式的時候是相同的結果,都是返回test_in的函式體的位址(此時函式體內num為100)。

t(100)(50)和t1(50) 與前面原理一樣。t(100)所對應的就是函式體內num為100是test_in函式體的位址,t1也是,這兩個代表著當num為100時,呼叫test_in(50)

結果如下:

如果上面的東西你都看懂了。那就結合之前學過的知識,看看能不能得出什麼結論?

閉包是個函式體,所以也是屬於不可變資料型別。對其進行深拷貝,也等同於淺拷貝。(驗證預習中的結論)

閉包的應用,本來我們要傳三個數算出乙個結果,利用閉包,可以保留那些不需要更換的數字,直接傳入需要替換的數字即可,而且可以重複利用。

python學習筆記 閉包

乙個函式a和乙個函式b,其中b函式位於a函式體內部,同時b函式體內呼叫了b函式之外,a函式之內的其他變數x 包括a中傳遞過來的引數 此時,x稱為b函式的環境變數,b函式和變數x就構成了乙個閉包。而函式b是需要返回的,也就是返回函式b,其中在返回的時候,對a引數x的呼叫也包括在了裡面,有點封閉包含的意...

Python之閉包學習筆記

走棋子是乙個很好的例子理解為什麼用閉包。資料來自網易雲課堂 假設需求是給定一顆在 0,0 位置的棋子,使用者互動輸入移動方向與步數,寫乙個函式記錄棋子的位置變化。這個函式可以是這樣的 以使用者輸入的方向與步數變數為引數,計算出移動後的位置值作為函式返回值。那麼走第一步時,基於初始位置值 0,0 做計...

python筆記 閉包

閉包 在乙個外函式中定義了乙個內函式,內函式裡運用了外函式的臨時變數,並且外函式的返回值是內函式的引用。這樣就構成了乙個閉包。def fun1 x def fun2 y return x y return fun2 fun1 3 3 9 def outer a b 10 inner是內函式 def ...