看板 Python 關於我們 聯絡資訊
Os環境:Win7 Py版本: 3.8.10 lambda關鍵字,如果在迴圈內設定,又沒帶參數, 感覺結果想不通。想請問原因。 code如下: #--------------------無參數----------------------- l_l = [ lambda: print(i) for i in range(3) ] for l in l_l: l() 輸出結果: 2 2 2 #--------------------帶參數--------------------- l_l2 = [ lambda x = i: print(x) for i in range(3) ] for l in l_l2: l() 輸出結果: 0 1 2 請問,沒帶參數的場合,每次迴圈還是把當下的 i 傳給 print 不是嗎? 為甚麼輸出結果卻都是迴圈的最後一個值呢? 這是lambda的某種特性嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.121.200 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1648437735.A.C3E.html
DaOppaiLoli: 這應該是 Scope 的關係 03/28 12:54
DaOppaiLoli: https://www.ideone.com/txytbg 03/28 12:54
DaOppaiLoli: 就算寫成一般 Function 也會有一樣的情況,i 對 lam 03/28 12:56
DaOppaiLoli: bda 來說是 Global 但 x 對 lambda 來說是 Local 03/28 12:56
原來如此,感謝。
ck574b027: python是用reference(簡稱位置)在運作的,你說的「 03/28 23:37
ck574b027: 當下的i」只是i的位置。又因python改變位置需要透過as 03/28 23:37
ck574b027: signment,而i在for並沒有發生這種事,只是在他的位 03/28 23:37
ck574b027: 置更新,所以全部lambda都拿著同個i。你可以不要用lis 03/28 23:37
ck574b027: t comprehension,把第一個例子的[]改成(),結果就會 03/28 23:37
ck574b027: 跟第二個一樣,因為generator等於在for才建立lambda 03/28 23:37
poototo: generator也是閉包把local的i讓lambda記住才yield出去 03/29 00:19
poototo: []的例子類似js迴圈的var會共用汙染 03/29 01:05
poototo: 也就是ck大所說的,都去同一addr取值 03/29 01:06
是的,看了Da大給的範例想通了。 透過把變數指向的位址印出來證實。 https://www.ideone.com/T4bUMs python在改動變數(reference)指向的值時, 會產生一個新物件,並把新物件的位址更新到原變數。 ※ 編輯: pshuang (111.243.112.208 臺灣), 03/29/2022 09:01:34