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
Lepaskan: 2024-12-29 06:55:14
asal
355 orang telah melayarinya

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))
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
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