Gelagat Fungsi Lambda dalam Gelung
Dalam coretan kod yang diberikan, kamus sedang diisi dengan fungsi lambda. Setiap fungsi bertanggungjawab untuk menukar direktori semasa kepada a特定名称. Walau bagaimanapun, apabila gelung selesai, semua fungsi lambda merujuk nama direktori yang sama.
Untuk memahami sebab ini berlaku, adalah penting untuk mengenali sifat fungsi lambda dalam gelung. Fungsi Lambda ialah penutupan, bermakna ia menangkap nilai skop lampirannya. Dalam kes ini, fungsi lambda ditakrifkan dalam gelung dan menangkap nilai pembolehubah d.
Walau bagaimanapun, pembolehubah d sedang digunakan semula sepanjang gelung, secara berterusan menimpa nilainya. Akibatnya, semua fungsi lambda akhirnya menangkap nilai akhir yang sama d.
Penyelesaian
Untuk menyelesaikan isu ini, adalah perlu untuk mengikat setiap fungsi lambda kepada nilai tertentu d. Ini boleh dicapai dengan menggunakan nilai parameter lalai:
lambda d=d: self.root.change_directory(d)
Dalam kod ini, fungsi lambda mengambil parameter pilihan d dengan nilai lalai bagi nilai semasa d dalam gelung. Memandangkan nilai parameter lalai dinilai apabila fungsi dicipta, setiap fungsi lambda akan menangkap nilai uniknya sendiri bagi d.
Sebagai alternatif, penutupan tambahan boleh digunakan untuk mencapai hasil yang sama:
(lambda d: lambda: self.root.change_directory(d))(d)
Dalam kes ini, fungsi lambda luar digunakan untuk membuat penutupan di sekeliling pembolehubah d. Fungsi lambda dalaman kemudiannya digunakan untuk melakukan perubahan direktori.
Dengan menggunakan teknik ini, adalah mungkin untuk memastikan bahawa setiap fungsi lambda dalam gelung mempunyai pengikatan uniknya sendiri pada pembolehubah d, menghasilkan yang diingini tingkah laku.
Atas ialah kandungan terperinci Mengapa Lambda Berfungsi dalam Gelung Semua Merujuk kepada Pembolehubah Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!