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
Lepaskan: 2024-12-22 01:57:14
asal
656 orang telah melayarinya

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)
Salin selepas log masuk

Begitu juga, apabila menggunakan lambdas:

functions = []

for i in range(3):
    functions.append(lambda: i)
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan