您好,登錄后才能下訂單哦!
直接看下面例子
my_ld = [lambda x:x*i for i in range(3)] my_list = [ld(2) for ld in my_ld] print(my_list)
本想是想通過以上代碼,輸出[0, 2, 4]的,但結果卻是[4, 4, 4]
下面說下本人對這個結果的理解:
因為Python解釋器,遇到lambda(或者def),只是定義了一個匿名函數對象,并保存在內存中,只有等到調用這個匿名函數的時候,才會執行函數內部的代碼(x*i)。所以匿名函數中的i并不是立即引用后面循環中的i值的,而是在調用嵌套函數的時候,才會查找i的值,這個特性也就是延遲綁定。
而 for i in range(3) 是另外一個表達式,Python解釋器解釋到就會直接執行,代碼執行到ld(2)時,循環已經結束了,此時的i指向2 ,my_ld為包含了三個匿名函數對象的列表,所以打印my_list的結果是[4, 4, 4]。
如果我們要輸出[0, 2, 4], 可以給lambda表達式多加一個缺省參數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函數中的缺省參數,是在Python解釋器遇到lambda a=i (或者def(a=i))時,就必須初始化默認值,此時 每循環一次,缺省參數a就需要找一次i的引用。i=0時,第一個匿名函數的默認參數值就是0,i=1時,第二個匿名函數的默認參數值就是1,以此類推。所以當代碼執行到ld(2)時,每個匿名函數中a的默認值都不一樣。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。