Rumah > pembangunan bahagian belakang > Tutorial Python > Bilakah Fungsi Sarang Bersarang Sebenarnya Ditutup?

Bilakah Fungsi Sarang Bersarang Sebenarnya Ditutup?

Linda Hamilton
Lepaskan: 2024-11-24 03:30:09
asal
504 orang telah melayarinya

When Are Nested Python Functions Actually Closures?

Fungsi Bersarang dalam Python: Mengapa Tidak Ditutup?

Fungsi bersarang dalam Python ialah ciri yang membolehkan fungsi ditakrifkan dalam fungsi lain. Fungsi ini mewarisi pembolehubah daripada skop lampirannya, memberikan akses kepada pembolehubah yang mungkin tidak dapat dicapai.

Walaupun berkongsi persamaan dengan penutupan, fungsi bersarang dalam Python tidak dirujuk sebagai penutupan. Perbezaan ini berpunca daripada tingkah laku mereka. Penutupan ialah fungsi yang mempunyai akses kepada pembolehubah daripada skop yang dilampirkan walaupun selepas skop itu telah dikeluarkan.

Apabila fungsi bersarang ditakrifkan dalam Python, ia sememangnya tidak mengekalkan akses kepada pembolehubah skop yang disertakan. . Sebaliknya, fungsi bersarang mencipta skop baharu dan mempunyai akses kepada pembolehubah dalam skop itu sahaja.

Untuk fungsi bersarang berfungsi sebagai penutup, ia mesti memenuhi dua kriteria utama:

  1. Ia mesti merujuk pembolehubah dalam skop lampirannya.
  2. Ia mesti dilaksanakan di luar lampirannya skop.

Jika fungsi bersarang memenuhi kedua-dua syarat ini, ia berfungsi sebagai penutup. Jika tidak, ia hanyalah fungsi bersarang.

Pertimbangkan contoh berikut:

def make_printer(msg):
    def printer():
        print(msg)
    return printer

printer = make_printer('Foo!')
printer()  # Output: Foo!
Salin selepas log masuk

Dalam contoh ini, fungsi pencetak mengakses pembolehubah msg daripada skop lampirannya (make_printer). Kerana ia dilaksanakan di luar skop lampirannya (apabila ia ditugaskan kepada pencetak dan kemudian dipanggil), ia bertindak sebagai penutup.

Sebaliknya, fungsi bersarang yang tidak merujuk pembolehubah daripada skop lampirannya bukanlah penutupan. Contohnya:

def make_printer(msg):
    def printer(msg=msg):
        print(msg)
    return printer

printer = make_printer('Foo!')
printer()  # Output: Foo!
Salin selepas log masuk

Di sini, pembolehubah msg terikat kepada nilai lalai parameter dan bukannya pembolehubah dalam skop yang disertakan. Oleh itu, fungsi bersarang ini bukan penutupan.

Ringkasnya, fungsi bersarang dalam Python tidak dipanggil penutupan kerana fungsi tersebut tidak secara semula jadi mempamerkan gelagat penutupan, iaitu mengakses pembolehubah daripada skop tertutup selepas ia keluar. . Untuk melayakkan diri sebagai penutupan, fungsi bersarang mesti kedua-dua pembolehubah rujukan daripada skop lampirannya dan dilaksanakan di luarnya.

Atas ialah kandungan terperinci Bilakah Fungsi Sarang Bersarang Sebenarnya Ditutup?. 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