Rumah > Artikel > pembangunan bahagian belakang > Mengapa Python Lambdas Mengikat kepada Nilai Pembolehubah Setempat, Bukan Rujukan?
Fungsi Python Lambda dan Pengikatan Pembolehubah Setempat
Apabila bekerja dengan fungsi Python lambda, adalah penting untuk memahami tingkah laku mereka berkenaan rujukan kepada pembolehubah tempatan dalam skop yang ditakrifkan. Kod berikut menggambarkan isu ini:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
Dalam senario ini, kami menjangkakan untuk melihat 0 dan 1 dicetak pada konsol. Walau bagaimanapun, output sebenar mencetak 1 dua kali. Tingkah laku ini berpunca daripada cara Python lambdas mengikat kepada pembolehubah tempatan.
The Gotcha: Early Binding
Python lambdas tidak terikat pada rujukan pembolehubah tempatan apabila mereka telah dicipta. Sebaliknya, mereka mengikat nilai pembolehubah pada masa tertentu itu. Akibatnya, apabila lambda digunakan, ia mengakses nilai semasa pembolehubah, bukan nilai yang tersedia pada masa penciptaan.
Penyelesaian: Pengikatan Lewat dengan Argumen Lalai
Untuk mengikat pembolehubah setempat kepada fungsi lambda dan mengekalkan rujukannya yang betul, kita boleh menggunakan pengikatan lewat. Ini dicapai dengan menghantar argumen lalai kepada fungsi lambda, seperti yang dilihat di bawah:
<code class="python">x.append(lambda v=v: pv(v))</code>
Dengan perubahan ini, lambda akan terikat pada nilai v apabila lambda dicipta, bukan apabila ia dipanggil. Oleh itu, apabila kita mengulangi senarai x dan memanggil setiap fungsi lambda, kita akan memperoleh output yang dijangkakan 0 dan 1.
Memahami Pengikatan Awal
Untuk selanjutnya jelaskan konsep ini, pertimbangkan contoh berikut:
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
Coretan kod ini mencetak "selepas foo ditakrifkan" pada konsol, menunjukkan pembolehubah terikat pada masa panggilan fungsi, bukan penciptaan.
Atas ialah kandungan terperinci Mengapa Python Lambdas Mengikat kepada Nilai Pembolehubah Setempat, Bukan Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!