Fungsi Lambda dalam Gelung
Dalam Python, fungsi lambda menyediakan cara ringkas untuk mentakrifkan fungsi tanpa nama. Walau bagaimanapun, apabila digunakan dalam gelung, ia boleh membawa kepada tingkah laku yang tidak dijangka jika pengikatan yang betul tidak dipastikan.
Pertimbangkan coretan kod berikut:
directorys = {'login': <object>, 'home': <object>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
Niatnya adalah untuk mencipta arahan pemetaan kamus rentetan kepada fungsi yang menukar direktori. Walau bagaimanapun, hasilnya adalah tidak dijangka: dua fungsi lambda yang dicipta adalah sama dan melaksanakan arahan yang sama, menukar direktori kepada "log masuk."
Mengapa Ini Berlaku?
Fungsi Lambda dalam gelung berkongsi skop fungsi yang sama. Ini bermakna pembolehubah yang ditangkap oleh fungsi lambda adalah sama untuk semua lelaran gelung. Dalam kes ini, "d" mewakili nilai item terakhir dalam kamus "direktori", iaitu "log masuk."
Menyelesaikan Isu
Untuk memastikan pengikatan yang betul, kita perlu memastikan bahawa setiap fungsi lambda mempunyai akses kepada nilai uniknya sendiri iaitu "d." Satu pendekatan adalah untuk menghantar "d" sebagai parameter dengan nilai lalai:
lambda d=d: self.root.change_directory(d)
Dengan menetapkan nilai lalai "d" kepada nilai semasa "d" dalam setiap lelaran gelung, kami buat penutupan unik untuk setiap fungsi lambda. Sebagai alternatif, kita boleh menggunakan teknik penutupan tambahan untuk mencapai hasil yang sama:
(lambda d=d: lambda: self.root.change_directory(d))()
Fungsi lambda luar ini mencipta penutupan untuk "d" dan fungsi lambda dalam menggunakan "d" daripada penutupan.
Atas ialah kandungan terperinci Mengapa Lambda Berfungsi dalam Gelung Python Kadangkala Gagal Mengikat Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!