Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Fungsi Python Lambda Mengendalikan Rujukan Pembolehubah Tempatan dan Bilakah Ia Dinilai?

Bagaimanakah Fungsi Python Lambda Mengendalikan Rujukan Pembolehubah Tempatan dan Bilakah Ia Dinilai?

Linda Hamilton
Linda Hamiltonasal
2024-10-27 04:06:02428semak imbas

How do Python Lambda Functions Handle Local Variable References and When Do They Get Evaluated?

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!

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