Lambda dalam For Loop Sahaja Menangkap Nilai Terakhir
Apabila menggunakan fungsi lambda dalam gelung for, adalah penting untuk memahami kelakuannya berkenaan setempat penangkapan berubah-ubah. Secara lalai, lambda menangkap nilai pembolehubah tempatan pada masa lambda ditakrifkan. Walau bagaimanapun, jika pembolehubah tersebut berubah dalam gelung, lambda akan sentiasa menangkap nilai akhir yang mereka ambil.
Sampel Kod:
Pertimbangkan kod berikut:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda: self.filter_records(column, option) )
Kod ini bertujuan untuk mencipta berbilang lambda, setiap satu menangkap nilai berbeza bagi pembolehubah pilihan. Walau bagaimanapun, apabila lambda ini dilaksanakan, mereka semua berkelakuan seolah-olah pilihan ditetapkan kepada "DEBUG", nilai terakhir yang digunakan dalam gelung.
Sebab:
Tingkah laku ini berlaku kerana nama dalam badan fungsi lambdas dinilai apabila fungsi itu dilaksanakan. Oleh itu, dalam kod yang disediakan, pembolehubah pilihan dinilai apabila setiap lambda dipanggil, menghasilkan penangkapan nilai akhir pilihan sahaja.
Penyelesaian:
Untuk mengelakkan isu ini, adalah perlu untuk menangkap nilai pilihan pada masa lambda ditakrifkan. Ini boleh dicapai dengan memberikan pilihan kepada pembolehubah baharu dalam lambda, seperti yang dilihat dalam kod yang diubah suai di bawah:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt) )
Dengan menggunakan parameter opt dalam lambda, nilai pilihan ditangkap pada masa itu lambda dicipta, memastikan setiap lambda beroperasi dengan nilai yang betul.
Atas ialah kandungan terperinci Mengapa Lambdas dalam For Loops Hanya Menangkap Nilai Terakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!