Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi Dicipta dalam Gelung Mengembalikan Nilai yang Sama, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Fungsi Dicipta dalam Gelung Mengembalikan Nilai yang Sama, dan Bagaimana Saya Boleh Membetulkannya?

Linda Hamilton
Linda Hamiltonasal
2025-01-04 13:05:47537semak imbas

Why Do Functions Created in a Loop Return the Same Value, and How Can I Fix It?

Mencipta Fungsi (atau Lambdas) dalam Gelung (atau Pemahaman): Memahami Pengikatan Lewat

Apabila mencipta fungsi atau lambda dalam gelung, adalah penting untuk mempertimbangkan konsep pengikatan lewat. Dalam contoh yang diberikan:

functions = []

for i in range(3):
    def f():
        return i
    functions.append(f)

setiap fungsi mencari nilai i selewat mungkin, iaitu selepas gelung selesai. Akibatnya, semua fungsi mengembalikan nilai akhir i, iaitu 2.

Untuk menyelesaikan isu ini dan mendapatkan tiga fungsi berbeza yang mengeluarkan 0, 1 dan 2, kita perlu memaksa pengikatan awal. Ini boleh dicapai dengan menggunakan parameter lalai:

functions = []

for i in range(3):
    def f(i=i):  # Default parameter for i
        return i
    functions.append(f)

Dalam kes ini, parameter lalai i dinilai pada masa definisi, bukan pada masa panggilan, memastikan setiap fungsi menggunakan nilai i yang betul.

Sebagai alternatif, kita boleh menggunakan kilang fungsi untuk mencipta fungsi dengan pengikatan awal:

def make_f(i):
    def f():
        return i
    return f

functions = []

for i in range(3):
    functions.append(make_f(i))

Fungsi make_f mencipta fungsi baharu dengan nilai yang betul iaitu i bound early.

Atas ialah kandungan terperinci Mengapa Fungsi Dicipta dalam Gelung Mengembalikan Nilai yang Sama, dan Bagaimana Saya Boleh Membetulkannya?. 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