Memahami Python Lambda Binding dengan Nilai Tempatan
Apabila bekerja dengan fungsi lambda dalam Python, adalah penting untuk memahami cara ia berinteraksi dengan pembolehubah setempat, terutamanya apabila berbilang lambda merujuk pembolehubah yang sama.
Pertimbangkan contoh berikut:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) # Lambda binds to the reference of 'v' for xx in x: xx() # Prints 1 twice</code>
Pada mulanya, anda mungkin menjangkakan fungsi lambda dalam senarai 'x' merujuk kepada 'v' semasa pada masa penciptaan mereka. Walau bagaimanapun, ini bukan cara Python berfungsi. Sebaliknya, Python menilai nama pembolehubah pada masa panggilan fungsi, membawa kepada kedua-dua lambda merujuk nilai akhir 'v' (iaitu 1).
Untuk mencapai tingkah laku yang diingini (mencetak 0 dan kemudian 1). ), anda boleh menggunakan mekanisme hujah lalai Python:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda v=v: pv(v)) # Lambda binds to the copy of 'v' at creation time for xx in x: xx() # Prints 0 and then 1</code>
Dengan menetapkan hujah lalai untuk 'v', fungsi lambda terikat pada salinan tempatan 'v' yang dibuat pada masa penciptaannya, memastikan mereka mengekalkan rujukan yang betul apabila digunakan kemudian.
Ingat, Python mencari nama pembolehubah pada masa panggilan fungsi, bukan masa penciptaan. Prinsip ini digunakan bukan sahaja untuk lambda tetapi juga untuk fungsi biasa, seperti yang ditunjukkan oleh contoh berikut:
<code class="python">x = "before foo defined" def foo(): print(x) # Prints "after foo was defined" x = "after foo was defined" foo()</code>
Atas ialah kandungan terperinci Bagaimanakah Fungsi Python Lambda Mengendalikan Rujukan Pembolehubah Tempatan dan Bilakah Ia Dinilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!