Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Gelagat Penutupan Leksikal Python Berbeza daripada Perl?

Mengapakah Gelagat Penutupan Leksikal Python Berbeza daripada Perl?

Patricia Arquette
Patricia Arquetteasal
2024-12-12 16:42:10195semak imbas

Why Does Python's Lexical Closure Behavior Differ from Perl's?

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.

  • Python: Fungsi yang dicipta dalam gelung semuanya berkongsi penutupan gelung persekitaran. Memandangkan pembolehubah gelung i diubah suai, semua fungsi merujuk kepada i yang diubah suai yang sama.
  • Perl: Fungsi yang dicipta dalam gelung masing-masing mempunyai penutupan sendiri, menangkap nilai i pada masa ia ditakrifkan.

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!

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