Cara Mengelakkan Keputusan Tidak Dijangka daripada Pengubahsuaian Parameter dalam Fungsi Lambda

Patricia Arquette
Lepaskan: 2024-10-19 17:28:01
asal
683 orang telah melayarinya

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>
Salin selepas log masuk

Yang dijangka output kod ini ialah:

do
re
mi
Salin selepas log masuk
Salin selepas log masuk

Walau bagaimanapun, output sebenar ialah:

mi
mi
mi
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!