Memahami Penangkapan Penutupan dalam Fungsi Lambda
Fungsi Lambda, alat yang ringkas dan mudah dalam pengaturcaraan, membenarkan fungsi tanpa nama yang disimpan dalam penutupan. Dalam Python, penutupan menangkap skop yang disertakan untuk mendapatkan akses kepada pembolehubah luaran, tetapi tingkah laku ini kadangkala boleh mengejutkan.
Pertimbangkan senario di mana satu set fungsi lambda dimulakan dalam gelung untuk menambah nombor tertentu pada input mereka. Secara intuitif, seseorang mungkin menjangkakan fungsi ini mengekalkan nilai pembolehubah gelung pada masa penciptaannya. Walau bagaimanapun, hasil sebenar adalah berbeza - semua fungsi lambda menangkap nilai akhir pembolehubah gelung.
Ini berlaku kerana penutupan dalam Python menangkap skop yang disertakan, bukan rujukan kepada pembolehubah atau objek tertentu. Dalam erti kata lain, fungsi lambda secara berkesan membenamkan rujukan kepada pembolehubah gelung i, yang berubah apabila gelung berlangsung. Akibatnya, apabila mana-mana fungsi ini dipanggil, ia menggunakan nilai akhir i, yang membawa kepada output yang tidak dijangka.
Menguatkuasakan Tangkapan Nilai dalam Fungsi Lambda
Untuk memintas perkara ini mengeluarkan dan menangkap nilai yang dimaksudkan bagi pembolehubah gelung, adalah perlu untuk memaksa tangkapan menggunakan parameter dengan nilai lalai. Dengan memperuntukkan pembolehubah kepada parameter dalam fungsi lambda dan membekalkan nilai lalai bagi nilai yang dimaksudkan, adalah mungkin untuk mengekalkan gelagat tangkapan yang diingini.
Contoh:
# Initialize an array of lambda functions adders = [None, None, None, None] # Create lambda functions with forced capture of i for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # Call a lambda function with input print(adders[1](3)) # Output: 4
Kesimpulan
Dengan memahami mekanisme tangkapan dalam fungsi lambda dan menggunakan teknik ini, adalah mungkin untuk mengawal nilai yang ditangkap oleh penutupan, memastikan tingkah laku yang diingini dalam pelaksanaan kod.
Atas ialah kandungan terperinci Mengapa Fungsi Lambda Python Menangkap Nilai Akhir Pembolehubah Gelung, dan Bagaimanakah Ini Boleh Dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!