Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi Dicipta dalam Gelung Kadang-kadang Mengembalikan Nilai yang Salah?
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!