Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Anda Menghalang Kekeliruan Penutupan Lambda Apabila Mencipta Lambdas dalam Gelung?

Bagaimana Anda Menghalang Kekeliruan Penutupan Lambda Apabila Mencipta Lambdas dalam Gelung?

Barbara Streisand
Barbara Streisandasal
2024-11-08 16:22:01987semak imbas

How Do You Prevent Lambda Closure Confusion When Creating Lambdas in Loops?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn