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

Barbara Streisand
Lepaskan: 2024-11-08 16:22:01
asal
986 orang telah melayarinya

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan