Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Tingkah Laku Penutupan Python Menghasilkan Keputusan yang Tidak Dijangka dalam Gelung Bersarang?

Mengapakah Tingkah Laku Penutupan Python Menghasilkan Keputusan yang Tidak Dijangka dalam Gelung Bersarang?

DDD
DDDasal
2024-11-29 00:09:12573semak imbas

Why Does Python's Closure Behavior Produce Unexpected Results in Nested Loops?

Memahami Penutupan Leksikal: Melihat Lebih Dekat Gelagat Penutupan Python

Apabila menyelami selok-belok penutupan leksikal, tingkah laku pelik dalam kod Python menjadi jelas. Pertimbangkan contoh berikut:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)

Apa yang mengejutkan kami, kod ini mencetak "4 4 4" dan bukannya "0 2 4" yang dijangkakan. Tingkah laku yang tidak dijangka ini berpunca daripada cara Python mengendalikan penutupan leksikal.

Tidak seperti dalam Perl, yang mencipta penutupan baharu untuk setiap lelaran, Python mencipta tiga fungsi berasingan. Walau bagaimanapun, setiap fungsi mengekalkan penutupan persekitaran di mana ia ditakrifkan, iaitu persekitaran global. Penutupan yang dikongsi ini menyebabkan setiap fungsi merujuk kepada pembolehubah boleh ubah yang sama i, yang membawa kepada output yang tidak dijangka.

Untuk menangani isu ini, penyelesaian yang diubah suai mesti digunakan. Dengan memperkenalkan pencipta fungsi dan menggunakannya di dalam gelung, kami mencipta persekitaran yang berbeza untuk setiap fungsi dengan nilai i yang unik:

flist = []

for i in xrange(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print f(2)

Kod yang disemak ini membetulkan masalah, menunjukkan perbezaan yang halus tetapi ketara dalam cara Python dan Perl mengendalikan penutupan leksikal. Dengan memahami gelagat penutupan bahasa pengaturcaraan khusus yang digunakan, pembangun boleh mengelakkan hasil yang tidak dijangka dan menulis kod yang lebih mantap dan boleh diramal.

Atas ialah kandungan terperinci Mengapakah Tingkah Laku Penutupan Python Menghasilkan Keputusan yang Tidak Dijangka dalam Gelung Bersarang?. 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