python閉包延時綁定,隨記

python閉包延時綁定,隨記

在這裏插入圖片描述
執行後,解釋器碰到了一個列表解析,循環取multipliers()函數中的值,而multipliers()函數返回的是一個列表對象,這個列表中有4個元素,
每個元素都是一個匿名函數(實際上說是4個匿名函數也不完全準確,其實是4個匿名函數計算後的值,因爲後面for i 的循環不光循環了4次,
同時提還提供了i的變量引用,等待4次循環結束後,i指向一個值i=3,這個時候,匿名函數纔開始引用i=3,計算結果。所以就會出現[6,6,6,6],
因爲匿名函數中的i並不是立即引用後面循環中的i值的,而是在運行嵌套函數的時候,纔會查找i的值,這個特性也就是延遲綁定)

☆Python解釋器,遇到lambda(類似於def),只是定義了一個匿名函數對象,並保存在內存中,只有等到調用這個匿名函數的時候,
纔會運行內部的表達式,而for i in range(4) 是另外一個表達式,需等待這個表達式運行結束後,纔會開始運行lambda 函數,此時的i 指向3,x指向2。

☆Python的延遲綁定其實就是隻有當運行嵌套函數的時候,纔會引用外部變量i,不運行的時候,並不是會去找i的值,這個就是第一個函數,爲什麼輸出的結果是[6,6,6,6]的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章