Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Python Lambdas Mengikat kepada Nilai Pembolehubah Setempat, Bukan Rujukan?

Mengapa Python Lambdas Mengikat kepada Nilai Pembolehubah Setempat, Bukan Rujukan?

Linda Hamilton
Linda Hamiltonasal
2024-10-28 06:37:02975semak imbas

 Why do Python Lambdas Bind to Local Variables' Values, Not References?

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!

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
Artikel sebelumnya:cs minggu ythonArtikel seterusnya:cs minggu ython