作者pshuang (中山先生忠實信徒-我愛蘿)
看板Python
標題[問題] lambda 在迴圈內設定的問題
時間Mon Mar 28 11:22:12 2022
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://webptt.com/m.aspx?n=bbs/Python/M.1648437735.A.C3E.html
1F:推 DaOppaiLoli: 這應該是 Scope 的關係 03/28 12:54
3F:→ DaOppaiLoli: 就算寫成一般 Function 也會有一樣的情況,i 對 lam 03/28 12:56
4F:→ DaOppaiLoli: bda 來說是 Global 但 x 對 lambda 來說是 Local 03/28 12:56
原來如此,感謝。
5F:→ ck574b027: python是用reference(簡稱位置)在運作的,你說的「 03/28 23:37
6F:→ ck574b027: 當下的i」只是i的位置。又因python改變位置需要透過as 03/28 23:37
7F:→ ck574b027: signment,而i在for並沒有發生這種事,只是在他的位 03/28 23:37
8F:→ ck574b027: 置更新,所以全部lambda都拿著同個i。你可以不要用lis 03/28 23:37
9F:→ ck574b027: t comprehension,把第一個例子的[]改成(),結果就會 03/28 23:37
10F:→ ck574b027: 跟第二個一樣,因為generator等於在for才建立lambda 03/28 23:37
11F:推 poototo: generator也是閉包把local的i讓lambda記住才yield出去 03/29 00:19
12F:推 poototo: []的例子類似js迴圈的var會共用汙染 03/29 01:05
13F:→ 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