Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Python Lambda terikat pada rujukan tempatan pada masa seruan, bukan masa penciptaan?

Mengapakah Python Lambda terikat pada rujukan tempatan pada masa seruan, bukan masa penciptaan?

DDD
DDDasal
2024-10-29 21:41:29459semak imbas

Why does Python Lambda bind to local references at invocation time, not creation time?

Pengikatan Python Lambda pada Rujukan Setempat

Kod berikut mencetak '1' dua kali dan bukannya '0' dan '1':

<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>

Untuk memahami tingkah laku ini, adalah penting untuk memahami cara Python lambdas berinteraksi dengan pembolehubah tempatan. Bertentangan dengan jangkaan, lambda tidak terikat pada rujukan pembolehubah tempatan pada masa penciptaannya. Sebaliknya, ia mengikat pada nilai pembolehubah yang diambil pada saat penyeruannya.

Untuk membetulkan isu ini dan mengikat pembolehubah setempat dengan betul kepada fungsi lambda, anda perlu menggunakan argumen lalai untuk lambda. Dengan menetapkan nilai lalai pembolehubah dalam definisi lambda (cth., lambda v=v: pv(v)), lambda akan merujuk kepada nilai pembolehubah apabila ia dicipta.

Tingkah laku ini ialah tidak eksklusif untuk lambda. Pertimbangkan contoh berikut:

<code class="python">x = "before foo defined"

def foo():
    print x

x = "after foo was defined"

foo()</code>

Output kod ini ialah "selepas foo ditakrifkan," kerana Python mencari nilai x pada masa fungsi dipanggil, bukannya semasa ia dicipta .

Atas ialah kandungan terperinci Mengapakah Python Lambda terikat pada rujukan tempatan pada masa seruan, bukan masa penciptaan?. 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