Mencipta Lambdas Di Dalam Gelung tanpa Penutupan Pembolehubah
Apabila mencipta lambdas di dalam gelung yang berulang pada senarai objek, adalah penting untuk mengelakkan penutupan berubah-ubah. Penutupan pembolehubah berlaku apabila fungsi mengekalkan akses kepada pembolehubah di luar skop terdekatnya. Ini boleh membawa kepada tingkah laku yang tidak dijangka, seperti semua lambda merujuk nilai akhir pembolehubah yang sama.
Masalahnya:
Kod berikut menunjukkan masalah:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var) for f in lambdas_list: print(f())
Apabila menggunakan lambda dalam kod ini, semua lambda akan menghasilkan hasil yang sama: nilai obj.some_var daripada objek terakhir dalam obj_list. Ini kerana semua lambda merujuk kepada pembolehubah obj yang sama, yang berubah dengan setiap lelaran gelung.
Penyelesaian:
Untuk mengelakkan penutupan pembolehubah, kita boleh gunakan sintaks lambda x=x: di mana x ialah pembolehubah yang ingin kita tangkap. Ini menangkap salinan obj dan menjadikannya setempat untuk setiap lambda:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda obj=obj: obj.some_var) for f in lambdas_list: print(f())
Kini, setiap lambda akan merujuk obj yang betul dan menghasilkan nilai yang dijangkakan untuk obj.some_var.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Penutupan Pembolehubah Apabila Mencipta Lambdas Dalam Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!