Mentafsir Penutupan Leksikal dalam Python vs Perl
Semasa meneroka penutupan leksikal dalam Javascript, persoalan timbul tentang tingkah laku pelik mereka 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, ia mengeluarkan "4 4 4" dan bukannya "0 2 4" yang dijangkakan.
Sebaliknya, kod Perl yang setara ini menghasilkan yang diingini hasil:
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print $f->(2), "\n"; }
Pendasar Perbezaan
Perbezaan utama terletak pada cara penutupan menangkap persekitarannya.
Penyelesaian Python
Untuk mencapai yang diharapkan tingkah laku dalam Python, anda perlu memaksa persekitaran yang berasingan untuk setiap fungsi. Satu penyelesaian ialah mencipta pencipta fungsi yang mengembalikan fungsi dengan penutupan berbeza:
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)
Kaedah ini memastikan setiap fungsi mempunyai penutupan tersendiri, dengan nilai uniknya sendiri iaitu i.
Atas ialah kandungan terperinci Mengapakah Gelagat Penutupan Leksikal Python Berbeza daripada Perl?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!