Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Lambda Saya Berfungsi dalam Gelung Semua Merujuk kepada Pembolehubah Yang Sama?

Mengapa Lambda Saya Berfungsi dalam Gelung Semua Merujuk kepada Pembolehubah Yang Sama?

Barbara Streisand
Barbara Streisandasal
2024-12-29 03:45:10966semak imbas

Why Do My Lambda Functions in a Loop All Refer to the Same Variable?

Lambda dalam Gelung

Dalam kod yang disediakan, niatnya adalah untuk mencipta kamus fungsi arahan di mana setiap nilai ialah ungkapan lambda yang memanggil self.root.change_directory dengan nama direktori tertentu. Walau bagaimanapun, kod tersebut secara tidak betul menyebabkan semua fungsi arahan melakukan perubahan direktori yang sama.

Isu timbul kerana ungkapan lambda merujuk pembolehubah tunggal, d, yang sama untuk setiap lelaran gelung. Akibatnya, semua ungkapan lambda akhirnya menunjuk kepada nilai terakhir d.

Untuk membetulkannya, adalah perlu untuk mengikat nilai unik d pada setiap ungkapan lambda. Ini boleh dicapai dengan menggunakan nilai lalai untuk parameter lambda, seperti ditunjukkan di bawah:

self.command["cd " + d] = lambda d=d: self.root.change_directory(d)

Dalam kes ini, d=d mencipta pengikatan baharu d kepada nilai semasa d untuk setiap lelaran gelung itu. Akibatnya, setiap ungkapan lambda mempunyai rujukan uniknya sendiri kepada nilai d.

Sebagai alternatif, penutupan boleh digunakan untuk mencapai kesan yang sama:

self.command["cd " + d] = (lambda d: lambda: self.root.change_directory(d))(d)

Penutupan ini mencipta yang baharu persekitaran untuk setiap ungkapan lambda, dengan d terikat kepada nilai semasa d. Oleh itu, setiap ungkapan lambda mempunyai akses kepada nilai unik d.

Atas ialah kandungan terperinci Mengapa Lambda Saya Berfungsi dalam Gelung Semua Merujuk kepada Pembolehubah Yang Sama?. 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