前置內容
為了更容易理解閉包,在說閉包之前,講一下兩個概念:作用域和嵌套函數。
- 作用域
作用域是變量能被訪問的范圍,定義在函數內的變量是局部變量,局部變量的作用范圍只能在函數內部,它不能在函數被外引用。
定義在模塊最外層的變量是全局變量,它是全局范圍可見的,所以在函數體內部也可以讀取到全局變量。
- 嵌套函數 在函數內部,再定義函數,里面的函數稱之為嵌套函數
對于嵌套函數,它可以訪問到其外層作用域中定義的局部變量,如代碼示例中的變量 msg。
局部變量脫離函數作用域是無法被訪問,閉包使局部變量脫離函數作用域,能夠被引用訪問。
什么是閉包
接下來說一下,什么是閉包?
閉包是一類特殊的函數,在一個函數的作用域內定義一個新函數(嵌套函數),且這個函數中的變量使用了外部函數的局部變量,那么這個函數就是一個閉包。
閉包本質是一個函數,記錄并保存當前函數執行狀態,相關示例如下:
閉包原理
Python 一切皆對象,即函數也是對象,所有函數都有一個 _closure_屬性,如果這個函數是一個閉包,那么_closure_屬性值是一個元組對象,這個元組包含了閉包中的自由變量。
閉包,一個應用示例
閉包可以根據外部作用域的局部變量值來得到不同的結果,例如我們修改外部變量,閉包根據這個變量展現出不同的功能
以下例子就是根據不同的刷選條件,得到不同得分:
閉包使用注意
在閉包中是不能修改外部作用域的局部變量:
雖然在閉包里給num變量賦值,但其num變量跟外部函數中的變量num是兩個獨立變量
另一個閉包使用錯誤:
這段程序的本意是在每次調用閉包函數時都對變量n進行+1的操作,這樣是不允許的
代碼改進: