打算在過年前每天總結一個知識點,所以把自己總結的知識點分享出來,中間參考了網路上很多大神的總結,但是發佈時候因為時間太久可能沒有找到原文鏈接,如果侵權請聯繫我刪除 20191030:閉包 首先一個函數,如果函數名後緊跟一對括弧,相當於現在我就要調用這個函數,如果不跟括弧,相當於只是一個函數的名字,里 ...
打算在過年前每天總結一個知識點,所以把自己總結的知識點分享出來,中間參考了網路上很多大神的總結,但是發佈時候因為時間太久可能沒有找到原文鏈接,如果侵權請聯繫我刪除
20191030:閉包
首先一個函數,如果函數名後緊跟一對括弧,相當於現在我就要調用這個函數,如果不跟括弧,相當於只是一個函數的名字,裡面存了函數所在位置的引用。
閉包就是能夠讀取其他函數內部變數的函數。例如在javascript中,只有函數內部的子函數才能讀取局部變數,所以閉包可以理解成“定義在一個函數內部的函數“。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。
def myClosure(msg): closuremsg = "閉包msg" def inner(): print(closuremsg) return closuremsg+msg # 返回內部函數的應用 return inner a = myClosure("閉包測試") print(a()) b = myClosure("閉包是否能識別變數測試") print(b()) 輸出結果: 閉包msg 閉包msg閉包測試 閉包msg 閉包msg閉包是否能識別變數測試
按理說myClosure函數調用結束後closuremsg參數的作用域結束,closuremsg記憶體空間釋放
但是外函數結束的時候發現內部函數將會用到自己的臨時變數,這兩個臨時變數就不會釋放,會綁定給這個內部函數,所以外函數已經結束了,調用內函數的時候仍然能夠使用外函數的臨時變數。
閉包的臨時變數修改-使用nonlocal關鍵字
def myClosure(): closurvar = 10 def inner(innervar): nonlocal closurvar closurvar +=innervar return closurvar # 返回內部函數的應用 return inner c = myClosure() print(c(1)) print(c(2)) 輸出結果: 11 13
可以看出每次調用inner的時候使用的closurvar變數其實是一個。
閉包的作用
- 實現裝飾器
- 面向對象
- 實現單例模式