Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengelakkan Penutupan Pembolehubah Apabila Mencipta Lambdas Dalam Gelung?

Bagaimana untuk Mengelakkan Penutupan Pembolehubah Apabila Mencipta Lambdas Dalam Gelung?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-16 14:31:03645semak imbas

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())

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!

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