Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apa yang Menyebabkan Gelagat Penutupan Lambda yang Tidak Dijangka dalam Python?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-21 13:10:30805semak imbas

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>

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

a 1
b 1
c 1

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

c 1
c 1
c 1

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>

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!

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