Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi Dicipta dalam Gelung Kadang-kadang Mengembalikan Nilai yang Salah?

Mengapa Fungsi Dicipta dalam Gelung Kadang-kadang Mengembalikan Nilai yang Salah?

Linda Hamilton
Linda Hamiltonasal
2024-12-27 18:11:15375semak imbas

Why Do Functions Created in Loops Sometimes Return the Wrong Values?

Mengendalikan Penciptaan Fungsi dalam Gelung: Menyelesaikan Masalah Pengikatan Lewat

Apabila cuba mencipta fungsi dalam gelung, isu biasa timbul. Dalam contoh yang diberikan, matlamatnya adalah untuk menghasilkan tiga fungsi yang masing-masing mengembalikan 0, 1, dan 2. Walau bagaimanapun, ketiga-tiga fungsi akhirnya mengembalikan nilai yang sama (2). Ini berlaku disebabkan oleh ikatan lewat, di mana fungsi menangguhkan penilaian pembolehubah 'i' sehingga saat terakhir yang mungkin.

Memahami Pengikatan Lewat

Dalam kod tanpa pembetulan:

for i in range(3):
    def f():
        return i

Setiap 'f' mencari 'i' lewat pelaksanaan gelung, pada masa 'i' telah mencapai nilai akhir 2. Akibatnya, ketiga-tiga fungsi mengembalikan 2, walaupun gelung berhasrat untuk mencipta fungsi mengembalikan 0, 1 dan 2.

Menyelesaikan Isu

Penyelesaian kepada masalah ini adalah dengan menguatkuasakan awal mengikat. Ini boleh dicapai dengan menghantar 'i' sebagai hujah kepada fungsi 'f' seperti ini:

for i in range(3):
    def f(i=i):
        return i

Dalam kod yang dikemas kini ini, 'i' dicari pada masa definisi, apabila gelung dilaksanakan dan bukannya pada masa panggilan apabila 'f' dilaksanakan.

Penggunaan Penyelesaian Alternatif Penutupan

Pendekatan lain ialah menggunakan penutupan untuk mencipta "kilang fungsi":

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

Dalam gelung, 'f' kemudiannya boleh dibuat menggunakan 'f = make_f (i)'. Pendekatan ini juga memastikan pengikatan awal, kerana fungsi 'make_f' menghantar nilai 'i' kepada 'f' pada masa definisi.

Atas ialah kandungan terperinci Mengapa Fungsi Dicipta dalam Gelung Kadang-kadang Mengembalikan Nilai yang Salah?. 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