Rumah >pembangunan bahagian belakang >Tutorial Python >Cara Mengelakkan Keputusan Tidak Dijangka daripada Pengubahsuaian Parameter dalam Fungsi Lambda

Cara Mengelakkan Keputusan Tidak Dijangka daripada Pengubahsuaian Parameter dalam Fungsi Lambda

Patricia Arquette
Patricia Arquetteasal
2024-10-19 17:28:01848semak imbas

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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!

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