Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah anda menangkap pembolehubah tempatan dalam penutupan lambda dalam gelung?

Bagaimanakah anda menangkap pembolehubah tempatan dalam penutupan lambda dalam gelung?

DDD
DDDasal
2024-11-10 12:52:03300semak imbas

How do you capture local variables in lambda closures within loops?

Penutupan Lambda dan Skop Pembolehubah dalam Gelung

Apabila mentakrifkan lambda dalam gelung, adalah penting untuk memahami cara skop pembolehubah berfungsi. Dalam coretan kod yang disediakan, setiap lambda yang dibuat di dalam gelung merujuk obj pembolehubah yang sama, yang diubah suai dengan setiap lelaran.

Resolusi Skop Lalai

Secara lalai, a lambda akan menangkap pembolehubah dari skop yang disertakan. Dalam kod yang diberikan, skop yang disertakan ialah blok gelung. Jadi, setiap lambda berkesan menangkap nilai terakhir obj. Tingkah laku ini boleh membawa kepada hasil yang salah apabila memanggil lambda daripada skop yang berbeza, kerana ia mungkin tidak mempunyai nilai yang dijangkakan.

Tangkap Pembolehubah Setempat

Untuk menyelesaikan isu ini , anda perlu memaksa lambda untuk menangkap nilai semasa obj. Ini boleh dicapai dengan memperkenalkan pembolehubah tempatan baharu dalam lambda yang terikat kepada obj pada masa penciptaan. Coretan kod berikut menunjukkan pendekatan ini:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda obj=obj: obj.some_var)

Dengan menghantar obj secara eksplisit sebagai hujah kepada lambda, kami mencipta pembolehubah tempatan baharu untuk setiap lambda. Ini memastikan bahawa setiap lambda menangkap nilai setempat obj daripada lelaran gelung. Akibatnya, apabila anda memanggil lambda dari skop lain, mereka akan mengakses nilai yang betul.

Atas ialah kandungan terperinci Bagaimanakah anda menangkap pembolehubah tempatan dalam penutupan lambda 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