這篇文章帶給大家的內容是關於python閉包是什麼? python閉包的簡單介紹(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
什麼是閉包?
其實我們在使用函數過程中不經意就會觸發閉包,因為總是會因為某些原因會在函數內引用或修改上一層函數的變量,這時就會觸發閉包
那麼什麼是閉包?其實就是函數巢狀時觸發的一種規則,當前函數引用到上一層函數的局部命名空間的變數並且函數本身被當成物件返回時就觸發該規則。
我們說觸發了閉包的函數叫做閉包函數
閉包最大的特點就是它可以被外層函數返回後賦值給一個變量,並且攜帶了外層函數內定義的變量
範例如下:
def func1(): a = 2 #变量a为函数func1()开辟的局部命名空间内定义的变量 def func2(x): return x**a #函数fun2()内引用了变量a print('func2的id:',id(func2)) return func2 #内层函数名被当作返回值,此时闭包规则达成。 res = func1() # 此时res等同于func2,我们可以看看他们的id完全相同 print('res的id: ',id(res)) print(res(3)) del func1 print('删除函数func1之后:',res(5)) print(res.__closure__) print(type(res.__closure__[0])) print(res.__closure__[0].cell_contents) #此时,如果函数func2()没有引用外部函数变量a,我们可以试着把return x**a这句改成return x,这时函数func2就没有触发闭包规则 #此时如果再次打印res.__closure__,你会发现输出值为None
從下面輸出結果可以看出,即使刪除了函數func1,理論上應該消失的變數a依然可以使用(理論上a對應的局部空間消失了,則a應消失),變數a之所以仍可被引用,是因為閉包規則的作用,外部函數的局部變數可以被內部函數引用,即使外部函數已經回傳了。
其實函數本身也是對象,而物件又有很多屬性,其中和閉包相關的就是 closure 屬性。
closure 屬性定義的是包含 cell 物件的元組,其中元組中的每一個 cell 物件用來保存作用域中變數的值。
func2的id: 139940709362136 res的id: 139940709362136 9 删除函数func1之后: 25 #我们来打印一下res的__closure__属性,可以看出它是由cell对象组成的元组 (<cell at 0x7f467c4a8558: int object at 0x5654c2553a40>,) <class 'cell'> #打印类型结果就是元组 2 #打印cell中的值可以看出,这个cell对象中存储的变量值为2
觸發閉包後,實現了引用上層局部命名空間變數的同時又不依賴該局部空間,即使該變數所在的函數被刪除了,閉包函數依然可以使用它,實際上閉包函數把它保存在了__closure__屬性中。
以上是python閉包是什麼? python閉包的簡單介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!