理解python中的閉包

  • 2020 年 1 月 13 日
  • 筆記

什麼是閉包?

在一個函數內部嵌套定義了另一個函數,其中內部函數使用了外部函數作用域的變數(自由變數),並且外部函數的返回值是內部函數的引用,當外部函數結束時,外部函數的變數會被綁定到內部函數,由此就構成了閉包。閉包的本質是一個函數,它有兩部分組成:內部函數及引用的外部函數變數,閉包使這些變數始終保存在記憶體中,不會隨外部函數的結束而清除。

構成閉包的條件?

構成閉包有三個條件:

1. 必須有一個內嵌函數

2. 內嵌函數必須引用外部函數中的變數

3. 外部函數的返回值必須是內嵌函數

閉包實例講解

閉包實例

def outer(a):      b = 5      def inter():          print(a+b)      return inter     if __name__ == '__main__':      #inter() 不能直接引用 內部函數在作用域內不可見      add = outer(5)      add()

如上實例,外部函數outer定義了內部函數inter(滿足閉包條件1),其中inter使用了outer的變數a,b,(滿足閉包條件2),另外outer返回inter的引用(滿足條件3),由此構成一個閉包。

首先測試直接調用inter函數,此時編譯報NameError,原因是內部函數inter不能直接被引用調用;關於作用域的講解可以觀看相關影片,見下文。

然後測試調用add = outer(5),該語句相當於將inter函數的引用與add綁定,同時inter綁定了變數a =5,b=5;再次執行add(),相當於執行了inter(),由此解決了不能直接執行inter的問題,同時獲得了外部的入參值。從該實例可以看出,閉包可以避免使用全局變數,同時返回內部函數的引用,也為裝飾器的實現奠定了基礎。

閉包的作用和意義

閉包是函數式編程的重要語法結構,也是一種組織程式碼的結構,提高程式碼復用性的一種手段,另外python中的裝飾器是基於閉包的一種應用。

其他資源分享:

關於作用域:請參看https://i.youku.com/i/UMzgxMTI3MjE2MA==?spm=a2hzp.8244740.0.0第16節;

關於閉 包:請參看https://i.youku.com/i/UMzgxMTI3MjE2MA==?spm=a2hzp.8244740.0.0 第21節;