Python中的延遲綁定原理詳解
直接看下面例子
my_ld = [lambda x:x*i for i in range(3)] my_list = [ld(2) for ld in my_ld] print(my_list)
本想是想通過(guò)以上代碼,輸出[0, 2, 4]的,但結(jié)果卻是[4, 4, 4]
下面說(shuō)下本人對(duì)這個(gè)結(jié)果的理解:
因?yàn)镻ython解釋器,遇到lambda(或者def),只是定義了一個(gè)匿名函數(shù)對(duì)象,并保存在內(nèi)存中,只有等到調(diào)用這個(gè)匿名函數(shù)的時(shí)候,才會(huì)執(zhí)行函數(shù)內(nèi)部的代碼(x*i)。所以匿名函數(shù)中的i并不是立即引用后面循環(huán)中的i值的,而是在調(diào)用嵌套函數(shù)的時(shí)候,才會(huì)查找i的值,這個(gè)特性也就是延遲綁定。
而 for i in range(3) 是另外一個(gè)表達(dá)式,Python解釋器解釋到就會(huì)直接執(zhí)行,代碼執(zhí)行到ld(2)時(shí),循環(huán)已經(jīng)結(jié)束了,此時(shí)的i指向2 ,my_ld為包含了三個(gè)匿名函數(shù)對(duì)象的列表,所以打印my_list的結(jié)果是[4, 4, 4]。
如果我們要輸出[0, 2, 4], 可以給lambda表達(dá)式多加一個(gè)缺省參數(shù)a=i,代碼如下:
my_ld = [lambda x, a=i:x*a for i in range(3)] my_list = [ld(2) for ld in my_ld] print(my_list)
Python函數(shù)中的缺省參數(shù),是在Python解釋器遇到lambda a=i (或者def(a=i))時(shí),就必須初始化默認(rèn)值,此時(shí) 每循環(huán)一次,缺省參數(shù)a就需要找一次i的引用。i=0時(shí),第一個(gè)匿名函數(shù)的默認(rèn)參數(shù)值就是0,i=1時(shí),第二個(gè)匿名函數(shù)的默認(rèn)參數(shù)值就是1,以此類推。所以當(dāng)代碼執(zhí)行到ld(2)時(shí),每個(gè)匿名函數(shù)中a的默認(rèn)值都不一樣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python腳本實(shí)現(xiàn)批量網(wǎng)站存活檢測(cè)遇到問(wèn)題及解決方法
本文是小編自己編寫的一個(gè)使用python實(shí)現(xiàn)批量網(wǎng)站存活檢測(cè)。在項(xiàng)目測(cè)試中非常有用。本文給大家分享了遇到的問(wèn)題及解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10Python利用前序和中序遍歷結(jié)果重建二叉樹(shù)的方法
這篇文章主要介紹了Python利用前序和中序遍歷結(jié)果重建二叉樹(shù)的方法,實(shí)例分析了Python二叉樹(shù)的定義與遍歷操作技巧,需要的朋友可以參考下2016-04-04pytorch中獲取模型input/output shape實(shí)例
今天小編就為大家分享一篇pytorch中獲取模型input/output shape實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Flask框架學(xué)習(xí)筆記之模板操作實(shí)例詳解
這篇文章主要介紹了Flask框架學(xué)習(xí)筆記之模板操作,結(jié)合實(shí)例形式詳細(xì)分析了flask框架模板引擎Jinja2的模板調(diào)用、模板繼承相關(guān)原理與操作技巧,需要的朋友可以參考下2019-08-08python matplotlib 畫(huà)dataframe的時(shí)間序列圖實(shí)例
今天小編就為大家分享一篇python matplotlib 畫(huà)dataframe的時(shí)間序列圖實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11關(guān)于Python中異常(Exception)的匯總
異常是指程序中的例外,違例情況。異常機(jī)制是指程序出現(xiàn)錯(cuò)誤后,程序的處理方法。當(dāng)出現(xiàn)錯(cuò)誤后,程序的執(zhí)行流程發(fā)生改變,程序的控制權(quán)轉(zhuǎn)移到異常處理。下面這篇文章主要匯總了關(guān)于Python中異常(Exception)的相關(guān)資料,需要的朋友可以參考下。2017-01-01Python2 Selenium元素定位的實(shí)現(xiàn)(8種)
這篇文章主要介紹了Python2 Selenium元素定位的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02