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