Anomali Penciptaan Fungsi dan Lambda dalam Gelung
Apabila cuba menjana fungsi dalam gelung, seperti yang dilihat dalam coretan kod di bawah, pelik isu timbul:
functions = [] for i in range(3): def f(): return i functions.append(f)
Begitu juga, apabila menggunakan lambdas:
functions = [] for i in range(3): functions.append(lambda: i)
Orang akan menjangkakan fungsi ini akan mengeluarkan nilai yang berbeza (0, 1, dan 2), tetapi semua fungsi akhirnya menghasilkan nilai yang sama (2).
Penjelasan dan Penyelesaian
Fenomena ini disebabkan oleh pengikatan pembolehubah lewat. Dalam fungsi Python, pembolehubah diselesaikan apabila dipanggil, yang bermaksud bahawa apabila fungsi dipanggil selepas gelung, nilai i sudah ditetapkan kepada 2. Untuk membetulkannya, kami menggunakan pengikatan awal dengan memperkenalkan sintaks f(i=i) . Di sini, nilai lalai untuk hujah i ditubuhkan pada masa definisi, menghasilkan pengikatan awal:
def f(i=i): return i
Sebagai alternatif, pendekatan yang lebih kompleks menggunakan penutupan dan "kilang fungsi" memastikan pengikatan awal sebagai baik:
def make_f(i): def f(): return i return f
Dalam gelung, kita kemudiannya boleh menggunakan f = make_f(i) dan bukannya pernyataan def.
Atas ialah kandungan terperinci Mengapa Fungsi Dicipta dalam Gelung Python Semua Mengembalikan Nilai yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!