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

Mengapakah Gelagat Penutupan Leksikal Python Berbeza daripada Perl?

Patricia Arquette
Lepaskan: 2024-12-12 16:42:10
asal
122 orang telah melayarinya

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)
Salin selepas log masuk

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";
}
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan