Apakah yang Ditangkap oleh Penutupan Fungsi Lambda Python?
Apabila bekerja dengan penutupan fungsi lambda Python, adalah penting untuk memahami gelagat tangkapan mereka. Penutupan menangkap nilai pembolehubah daripada skop tertutupnya yang digunakan dalam penutupan. Walau bagaimanapun, cara penangkapan ini berlaku boleh mengejutkan.
Untuk menggambarkan ini, pertimbangkan kod berikut:
adders = [None, None, None, None] for i in [0, 1, 2, 3]: adders[i] = lambda a: i + a print(adders[1](3))
Dalam kod ini, kami mencipta senarai fungsi lambda yang mengambil satu input dan menambah nilai tetap padanya. Nilai malar pada mulanya ditetapkan kepada nilai i semasa penciptaan fungsi. Walau bagaimanapun, apabila kami memeriksa senarai penutupan, kami secara mengejutkan mendapati bahawa kesemuanya merujuk kepada nilai akhir i, menghasilkan output yang tidak dijangka sebanyak 6.
Tingkah laku ini terhasil daripada fakta bahawa penutupan menangkap nilai pembolehubah dan bukannya rujukannya. Akibatnya, apabila nilai i berubah selepas penciptaan penutupan, penutupan terus merujuk kepada nilai yang ditangkap terakhir.
Menangkap Nilai Semasa
Untuk menangkap nilai semasa i, kita boleh menggunakan helah yang dikenali sebagai teknik "parameter dummy". Dengan mengisytiharkan parameter dengan nama yang sama dengan pembolehubah yang ingin kami tangkap dan menyediakannya dengan nilai lalai pembolehubah itu, kami memaksa penutupan untuk menangkap nilai semasa.
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # <-- Note the dummy parameter with a default value print(adders[1](3)) # Output: 4
Dengan teknik ini, penutupan akan menangkap nilai i pada masa penciptaannya, memastikan perubahan kepada i selepas itu tidak akan menjejaskan gelagat penutupan.
Atas ialah kandungan terperinci Apakah Pembolehubah Yang Sebenarnya Ditangkap oleh Penutupan Fungsi Python Lambda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!