Mengapa Penutupan Lambda Menangkap Nama Daripada Nilai?

DDD
Lepaskan: 2024-10-21 13:15:30
asal
782 orang telah melayarinya

Why Do Lambda Closures Capture Names Instead of Values?

Skop Penutupan Lambda Python

Apabila cuba menggunakan penutupan untuk mengalih keluar pembolehubah daripada tandatangan fungsi, anda mungkin menghadapi gelagat yang tidak dijangka. Khususnya, fungsi lambda yang tidak disertakan dalam fungsi lain mengembalikan nilai terakhir pembolehubah untuk semua kejadian.

Untuk memahami gelagat ini, adalah penting untuk mengenali bahawa penutupan menangkap nama, bukan nilai. Apabila anda mentakrifkan lambda sebagai lambda x: test_fun(n, x), pembolehubah n tidak dinilai dalam fungsi tetapi pada masa panggilan. Akibatnya, nilai yang diandaikan ialah nilai terakhir daripada gelung.

Untuk "menghapuskan" pembolehubah secara berkesan menggunakan penutupan, pembolehubah mesti dihantar sebagai hujah kepada fungsi. Ini memberikan nilai semasa pembolehubah kepada fungsi dan "menguncinya" dengan berkesan. Contohnya:

<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]]  # Bad, captured value is last value
stuff = [lambda x, n=n: n+x for n in [1, 2, 3]]  # Good, n is locked in</code>
Salin selepas log masuk

Sebagai alternatif, anda boleh menggunakan dua fungsi bersarang:

<code class="python">def makeFunc(n):
    return lambda x: x+n

stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
Salin selepas log masuk

Di sini, lambda dalam makeFunc menangkap pembolehubah n setempat dan bukannya yang global. Setiap panggilan makeFunc mencipta pembolehubah setempat baharu, memastikan fungsi lambda yang dikembalikan mempunyai nilai n yang unik.

Akhirnya, pilihan antara kesederhanaan dan fleksibiliti adalah milik anda. Anda boleh memilih penciptaan fungsi yang lebih ringkas dengan argumen tambahan dalam fungsi yang dikembalikan atau fungsi yang lebih bersih dengan proses penciptaan fungsi yang lebih rumit yang melibatkan dua fungsi bersarang.

Atas ialah kandungan terperinci Mengapa Penutupan Lambda Menangkap Nama Daripada Nilai?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan