Apa yang Menyebabkan Gelagat Penutupan Lambda yang Tidak Dijangka dalam Python?

Mary-Kate Olsen
Lepaskan: 2024-10-21 13:10:30
asal
884 orang telah melayarinya

What Causes Unexpected Lambda Closure Behavior in Python?

Skop Penutupan Lambda Python

Memahami gelagat penutupan lambda dalam Python boleh menjadi rumit. Dalam artikel ini, kami meneroka kes di mana fungsi lambda berkelakuan secara tidak dijangka, mengembalikan nilai yang sama untuk semua kes.

Isu:

Pertimbangkan kod berikut:

<code class="python">names = ['a', 'b', 'c']

def test_fun(name, x):
    print(name, x)

def gen_clousure(name):
    return lambda x: test_fun(name, x)

funcs1 = [gen_clousure(n) for n in names]
funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
Salin selepas log masuk

Apabila memanggil fungsi dalam funcs1, kami mendapat output yang dijangkakan:

a 1
b 1
c 1
Salin selepas log masuk

Namun, apabila memanggil fungsi dalam funcs2, kami mendapat hasil yang tidak dijangka:

c 1
c 1
c 1
Salin selepas log masuk

Keluaran yang dijangkakan hendaklah sama seperti dalam kes pertama, tetapi sebaliknya, kita melihat nilai nama akhir, 'c', untuk semua kes.

Penjelasan:

Kunci untuk memahami tingkah laku ini terletak pada konsep penutupan. Penutupan dalam Python membenarkan fungsi dalaman untuk mengakses pembolehubah dari skop yang disertakan. Dalam kes pertama (funcs1), fungsi lambda dicipta di dalam gelung, tetapi ia menangkap nama pembolehubah daripada skop yang disertakan dan mengikatnya pada nama dalam fungsi lambda.

Dalam kes kedua (funcs2 ), walau bagaimanapun, fungsi lambda merujuk terus pembolehubah n daripada skop yang disertakan tanpa mengikatnya pada nama dalam fungsi lambda. Ini bermakna apabila fungsi lambda dipanggil, ia menilai n pada masa itu, yang sentiasa mengembalikan nilai terakhir daripada gelung, menghasilkan output yang tidak dijangka.

Mengelakkan Isu:

Untuk mengelakkan isu ini dan mencapai tingkah laku yang diingini, kita mesti memastikan bahawa fungsi lambda menangkap pembolehubah daripada skop yang disertakan dan mengikatnya pada nama dalam fungsi lambda. Satu cara untuk melakukan ini ialah dengan membalut fungsi lambda dalam fungsi lain:

<code class="python">def makeFunc(n):
    return lambda x: x+n</code>
Salin selepas log masuk

Fungsi lambda yang terhasil dalam makeFunc menangkap nilai n daripada skop yang disertakan dan mengikatnya pada nama dalam fungsi lambda, mencapai tingkah laku yang diingini.

Atas ialah kandungan terperinci Apa yang Menyebabkan Gelagat Penutupan Lambda yang Tidak Dijangka dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan