Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Lambdas Saya dalam For Loop Hanya Menggunakan Nilai Terakhir?

Mengapa Lambdas Saya dalam For Loop Hanya Menggunakan Nilai Terakhir?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-18 06:17:10263semak imbas

Why Do My Lambdas in a For Loop Only Use the Last Value?

Lambda dalam For Loop Sahaja Mengambil Nilai Terakhir

Dalam kod berikut:

options=["INFO", "WARNING", "DEBUG"]

for i in range(len(options)):
    option=options[i]
    __cMenu.add_command(
        label="{}".format(option), 
        command=lambda: self.filter_records(column, option)
   )

beberapa lambda dicipta dan disimpan. Lambda ini harus menangkap nilai berbeza bagi pilihan pembolehubah tempatan. Walau bagaimanapun, apabila lambda ini digunakan, mereka semua berkelakuan seolah-olah pilihan telah ditetapkan kepada "DEBUG", nilai terakhir yang digunakan dalam gelung.

Isu ini timbul disebabkan oleh pemasaan penilaian nama dalam badan fungsi . Dalam kod yang disediakan, nama-nama dinilai apabila fungsi itu dilaksanakan. Akibatnya, lambdas yang dibuat dalam gelung semuanya merujuk kepada nilai pilihan yang sama pada masa pelaksanaan, iaitu "DEBUG".

Untuk memintas masalah ini, pengubahsuaian berikut boleh dibuat:

__cMenu.add_command(label="{}".format(option),
    command=lambda opt=option: self.filter_records(column, opt))

Dengan memperkenalkan option=option sebagai hujah kepada fungsi lambda, setiap lambda menangkap nilai pilihan yang betul pada masa penciptaan, sebaliknya daripada bergantung pada nilai pada masa pelaksanaan. Ini memastikan setiap lambda beroperasi pada nilai pilihan yang diingini.

Atas ialah kandungan terperinci Mengapa Lambdas Saya dalam For Loop Hanya Menggunakan Nilai Terakhir?. 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