Memahami Penutupan Leksikal dalam Python: Pemeriksaan Lebih Dalam
Dalam bidang pengaturcaraan, penutupan leksikal memainkan peranan penting dalam mengekalkan akses kepada pembolehubah dan fungsi yang ditakrifkan dalam melampirkan skop. Walau bagaimanapun, fenomena yang membingungkan boleh timbul apabila bekerja dengan penutupan dalam Python.
Closure Conundrum dalam Python
Pertimbangkan kod Python berikut:
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
Anehnya, kod ini mencetak "4 4 4" dan bukannya "0 2 4" yang dijangkakan. Untuk memahami tingkah laku ini, kita perlu menyelidiki sifat penutupan leksikal dalam Python.
Kelakuan Penutupan dalam Python dan Perl
Dalam Python, penutupan mengekalkan rujukan kepada pembolehubah dalam skop yang disertakan. Walau bagaimanapun, jika pembolehubah ini diubah suai dalam skop itu, penutupan akan menangkap nilai yang diubah suai, yang membawa kepada hasil yang tidak dijangka.
Tingkah laku ini berbeza dengan Perl, di mana penutupan menangkap persekitaran pada masa penciptaannya. Dalam kod Perl:
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); }
Setiap penutupan menangkap nilai $i pada masa penciptaannya, menghasilkan output yang dijangkakan: "0 2 4."
Menyelesaikan Teka-teki
Untuk menangani isu dalam Python, kita boleh mencipta fungsi dalam fungsi lain untuk mengasingkan penutupan' persekitaran.
flist = [] def outer(): for i in xrange(3): def inner(x): return x * i flist.append(inner) outer() for f in flist: print f(2)
Di sini, setiap lelaran gelung luar mencipta fungsi baharu yang mempunyai persekitarannya sendiri dan nilai unik i. Hasilnya, kami memperoleh output yang diingini: "0 2 4."
Kesimpulan
Penutupan leksikal menyediakan mekanisme yang berkuasa untuk mengakses pembolehubah dan fungsi merentas skop. Walau bagaimanapun, dalam Python, adalah penting untuk memahami implikasi penutupan pembolehubah boleh ubah, kerana ia boleh membawa kepada tingkah laku yang tidak dijangka. Dengan mengurus persekitaran di mana penutupan dibuat dengan teliti, kita boleh memanfaatkan potensi penuh mereka sambil mengelakkan perangkap.
Atas ialah kandungan terperinci Mengapa Gelagat Penutupan Leksikal Python Berbeza daripada Perl, dan Bagaimanakah Ini Boleh Diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!