Skop Fungsi Lambda dan Parameternya
Fungsi Lambda ialah fungsi tanpa nama yang boleh menangkap skop fungsi lampirannya. Ini membolehkan mereka mengakses pembolehubah dan parameter daripada skop induk. Walau bagaimanapun, tingkah laku ini kadangkala boleh membawa kepada hasil yang tidak dijangka apabila fungsi lambda menggunakan parameter yang diubah suai dalam fungsi lampiran.
Untuk menggambarkan isu ini, pertimbangkan kod berikut:
<code class="python">def callback(msg): print(msg) # Creating a list of function handles with an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Calling the lambda functions for f in funcList: f()</code>
Yang dijangka output kod ini ialah:
do re mi
Walau bagaimanapun, output sebenar ialah:
mi mi mi
Ini kerana fungsi lambda menangkap rujukan kepada pembolehubah m daripada skop yang disertakan. Apabila iterator melaksanakan gelung, ia memberikan nilai 'mi' kepada m dalam lelaran akhir. Akibatnya, semua fungsi lambda mempunyai rujukan kepada 'mi' apabila ia dilaksanakan, walaupun nilai yang berbeza telah dihantar kepada mereka semasa penciptaan.
Untuk menyelesaikan isu ini, anda boleh menangkap nilai m di masa penciptaan fungsi lambda dengan menggunakannya sebagai nilai lalai parameter pilihan:
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
Ini memastikan bahawa setiap fungsi lambda mempunyai akses kepada salinan mnya sendiri, menangkap nilai yang ditetapkan semasa lelaran gelung. Output kod ini ialah:
do re mi
Atas ialah kandungan terperinci Cara Mengelakkan Keputusan Tidak Dijangka daripada Pengubahsuaian Parameter dalam Fungsi Lambda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!