1. 程式人生 > 實用技巧 >【轉】spring-restry實現介面超時重試

【轉】spring-restry實現介面超時重試

直接看下面例子

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的預設值都不一樣。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援碼農教程。