Mencegah Kecelaruan Penutupan Lambda dalam Gelung
Apabila mencipta lambda dalam gelung yang berulang pada senarai objek, penting untuk mengetahui tingkah laku penutupan lambda. Secara lalai, lambdas menangkap pembolehubah dalam skop yang disertakan apabila ia ditakrifkan. Walau bagaimanapun, jika pembolehubah berubah dalam gelung, lambdas yang dibuat kemudian dalam gelung akan merujuk kepada nilai yang dikemas kini.
Pertimbangkan contoh berikut, di mana kita mencipta lambdas untuk mengakses atribut some_var objek:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var)
Jika kami kemudian melelang senarai lambda dan memanggil setiap lambda, kami mungkin mendapat nilai yang sama untuk semua lambda. Ini kerana lambda terakhir yang dibuat dalam gelung akan menangkap keadaan akhir obj dan nilai itu akan dikembalikan oleh semua lambda.
Untuk menyelesaikannya, kita boleh menentukan objek yang akan ditangkap oleh lambda menggunakan hujah lalai. Ini memastikan bahawa setiap lambda menangkap rujukan objek yang betul:
lambdas_list.append(lambda obj=obj: obj.some_var)
Dengan menggunakan pendekatan ini, setiap lambda akan menangkap objek yang dimaksudkan untuk dirujuk semasa ia dicipta. Ini akan mengelakkan kekeliruan dan memastikan bahawa lambda berkelakuan seperti yang diharapkan apabila dipanggil kemudian dalam gelung.
Atas ialah kandungan terperinci Bagaimana Anda Menghalang Kekeliruan Penutupan Lambda Apabila Mencipta Lambdas dalam Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!