[問題] lambda 在迴圈內設定的問題

看板Python作者 (中山先生忠實信徒-我愛蘿)時間2年前 (2022/03/28 11:22), 2年前編輯推噓3(3010)
留言13則, 3人參與, 2年前最新討論串1/2 (看更多)
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

03/28 12:54, 2年前 , 1F
這應該是 Scope 的關係
03/28 12:54, 1F

03/28 12:54, 2年前 , 2F

03/28 12:56, 2年前 , 3F
就算寫成一般 Function 也會有一樣的情況,i 對 lam
03/28 12:56, 3F

03/28 12:56, 2年前 , 4F
bda 來說是 Global 但 x 對 lambda 來說是 Local
03/28 12:56, 4F
原來如此,感謝。

03/28 23:37, 2年前 , 5F
python是用reference(簡稱位置)在運作的,你說的「
03/28 23:37, 5F

03/28 23:37, 2年前 , 6F
當下的i」只是i的位置。又因python改變位置需要透過as
03/28 23:37, 6F

03/28 23:37, 2年前 , 7F
signment,而i在for並沒有發生這種事,只是在他的位
03/28 23:37, 7F

03/28 23:37, 2年前 , 8F
置更新,所以全部lambda都拿著同個i。你可以不要用lis
03/28 23:37, 8F

03/28 23:37, 2年前 , 9F
t comprehension,把第一個例子的[]改成(),結果就會
03/28 23:37, 9F

03/28 23:37, 2年前 , 10F
跟第二個一樣,因為generator等於在for才建立lambda
03/28 23:37, 10F

03/29 00:19, 2年前 , 11F
generator也是閉包把local的i讓lambda記住才yield出去
03/29 00:19, 11F

03/29 01:05, 2年前 , 12F
[]的例子類似js迴圈的var會共用汙染
03/29 01:05, 12F

03/29 01:06, 2年前 , 13F
也就是ck大所說的,都去同一addr取值
03/29 01:06, 13F
是的,看了Da大給的範例想通了。 透過把變數指向的位址印出來證實。 https://www.ideone.com/T4bUMs python在改動變數(reference)指向的值時, 會產生一個新物件,並把新物件的位址更新到原變數。 ※ 編輯: pshuang (111.243.112.208 臺灣), 03/29/2022 09:01:34
文章代碼(AID): #1YGIddm- (Python)
文章代碼(AID): #1YGIddm- (Python)