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
Lepaskan: 2024-10-29 21:41:29
asal
466 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan