Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi Dicipta dalam Gelung Python Semua Mengembalikan Nilai yang Sama?

Mengapa Fungsi Dicipta dalam Gelung Python Semua Mengembalikan Nilai yang Sama?

DDD
DDDasal
2024-12-22 01:57:14738semak imbas

Why Do Functions Created in a Python Loop All Return the Same Value?

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!

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