Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Indeks Akhir Daripada Nilai Lelaran Gelung?

Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Indeks Akhir Daripada Nilai Lelaran Gelung?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 22:44:30925semak imbas

Why Do Lambda Functions in Loops Capture the Final Index Value Instead of the Loop Iteration Value?

Memahami Penutupan dalam Fungsi Python Lambda

Soalan Asal: Teka-teki Penutupan Lambda dengan Pencetakan Indeks

Dalam pengaturcaraan, penutupan merujuk kepada fungsi dalaman yang menangkap pembolehubah fungsi penutupnya walaupun selepas fungsi penutup telah kembali. Ini membolehkan fungsi dalaman mengekalkan akses kepada pembolehubah, menjadikannya berterusan sepanjang hayat penutupan.

Kes penggunaan biasa untuk ungkapan lambda adalah untuk mengikat pembolehubah kepada fungsi. Walau bagaimanapun, jika digunakan dalam gelung, seperti dalam kod contoh yang disediakan, fungsi lambda boleh mempamerkan gelagat yang tidak dijangka akibat penutupan.

Penjelasan Kod

Dalam kod yang diberikan, lima butang dicipta dalam satu gelung. Setiap butang diberikan fungsi lambda yang memanggil fungsi makeId() dan mencetak indeks i. Walau bagaimanapun, apabila pengguna mengklik pada mana-mana butang, fungsi makeId() sentiasa mencetak 5, iaitu nilai akhir i dalam gelung.

Masalah dan Penyelesaian

Isu ini timbul kerana apabila ungkapan lambda dilaksanakan, ia menyelesaikan pembolehubah i kepada nilainya pada masa itu. Memandangkan gelung telah ditamatkan pada masa itu, i diselesaikan kepada nilai terakhirnya, iaitu 5.

Untuk menyelesaikan isu ini, ungkapan lambda mesti diubah suai untuk menyatakan secara eksplisit nilai yang betul bagi i menggunakan parameter lambda . Secara lalai, lambdas menggunakan pembolehubah skop yang disertakan, tetapi menetapkan parameter memastikan pembolehubah setempat dengan nilai yang dikehendaki dicipta dalam lambda:

<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>

Dengan pengubahsuaian ini, fungsi lambda setiap butang menangkap nilai yang betul daripada i dari gelung, dan fungsi makeId() boleh mencetak indeks yang dimaksudkan dengan betul.

Nota Tambahan

Parameter lambda tidak perlu mempunyai yang sama nama sebagai pembolehubah yang disertakan. Ia boleh mempunyai sebarang nama, memastikan nilai yang betul ditangkap dalam skop lambda.

Atas ialah kandungan terperinci Mengapa Lambda Berfungsi dalam Gelung Menangkap Nilai Indeks Akhir Daripada Nilai Lelaran 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