Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Terakhir Daripada Setiap Nilai Lelaran?

Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Terakhir Daripada Setiap Nilai Lelaran?

Susan Sarandon
Lepaskan: 2024-12-21 07:52:10
asal
374 orang telah melayarinya

Why Do Lambda Functions in Loops Capture the Last Value Instead of Each Iteration's Value?

Lambda dalam Gelung

Pertimbangkan coretan kod berikut:

# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
Salin selepas log masuk

Matlamatnya ialah untuk mencipta kamus dua fungsi dengan kunci " cd login" dan "cd home". Walau bagaimanapun, keputusan menunjukkan bahawa kedua-dua fungsi lambda mempunyai kandungan yang sama dengan kunci "log masuk cd".

Untuk memahami tingkah laku yang tidak dijangka ini, adalah penting untuk mempertimbangkan cara fungsi lambda berfungsi dalam gelung bersarang. Apabila fungsi lambda ditakrifkan dalam gelung, ia menangkap pembolehubah daripada skop sekeliling. Dalam kes ini, pembolehubah d daripada gelung ditangkap oleh setiap fungsi lambda.

Walau bagaimanapun, fungsi lambda dilaksanakan secara malas. Jadi, apabila anda mengakses kamus self.command di luar gelung, semua fungsi lambda telah menangkap pembolehubah d yang sama, iaitu nilai terakhir d dalam gelung. Oleh itu, semua fungsi menunjuk kepada kaedah yang sama, menghasilkan tingkah laku yang diperhatikan.

Untuk menyelesaikan isu ini, kita perlu memastikan bahawa setiap fungsi lambda menangkap nilai d yang berbeza. Satu penyelesaian ialah dengan menghantar d sebagai parameter kepada fungsi lambda dan memberikan nilai lalai:

lambda d=d: self.root.change_directory(d)
Salin selepas log masuk

Kini, d dalam fungsi lambda menggunakan parameter, walaupun ia mempunyai nama yang sama. Nilai lalai untuk parameter ini dinilai apabila fungsi dicipta, mengikatnya pada nilai d yang betul untuk setiap lelaran gelung.

Sebagai alternatif, kita boleh menggunakan penutupan bersarang untuk mencapai hasil yang sama:

(lambda d: lambda: self.root.change_directory(d))(d)
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Terakhir Daripada Setiap Nilai Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan