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!