Rumah >pembangunan bahagian belakang >Tutorial Python >Apakah Pembolehubah Yang Sebenarnya Ditangkap oleh Penutupan Fungsi Python Lambda?

Apakah Pembolehubah Yang Sebenarnya Ditangkap oleh Penutupan Fungsi Python Lambda?

DDD
DDDasal
2024-12-29 06:55:14368semak imbas

What Variables Do Python Lambda Function Closures Actually Capture?

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!

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