Bagaimana untuk Mengelakkan Penutupan Pembolehubah Apabila Mencipta Lambdas Dalam Gelung?

Mary-Kate Olsen
Lepaskan: 2024-11-16 14:31:03
asal
556 orang telah melayarinya

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

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

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

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!

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