Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Gelagat Penutupan Leksikal Python Berbeza daripada Perl, dan Bagaimanakah Ini Boleh Diselesaikan?

Mengapa Gelagat Penutupan Leksikal Python Berbeza daripada Perl, dan Bagaimanakah Ini Boleh Diselesaikan?

Barbara Streisand
Lepaskan: 2024-12-01 14:46:13
asal
849 orang telah melayarinya

Why Does Python's Lexical Closure Behavior Differ from Perl's, and How Can This Be Resolved?

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

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

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

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!

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