Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Penutupan Mempengaruhi Akses Pembolehubah Setempat dalam Fungsi Python Bersarang?

Bagaimanakah Penutupan Mempengaruhi Akses Pembolehubah Setempat dalam Fungsi Python Bersarang?

Linda Hamilton
Linda Hamiltonasal
2024-12-18 09:29:18407semak imbas

How Do Closures Affect Local Variable Access in Nested Python Functions?

Pembolehubah Tempatan dalam Fungsi Bersarang: Kisah Penutupan dan Carian

Dalam Python, pembolehubah tempatan yang ditakrifkan dalam fungsi bersarang boleh berinteraksi dengan persekitaran skop. Untuk memahami interaksi ini, mari kita menyelidiki coretan kod yang menyerlahkan gelagat.

from functools import partial

class Cage(object):
    def __init__(self, animal):
        self.animal = animal

def gotimes(do_the_petting):
    do_the_petting()

def get_petters():
    for animal in ['cow', 'dog', 'cat']:
        cage = Cage(animal)

        def pet_function():
            print "Mary pets the " + cage.animal + "."

        yield (animal, partial(gotimes, pet_function))

funs = list(get_petters())

for name, f in funs:
    print name + ":",
    f()

Tugasan Ambiguous

Menjalankan kod ini menghasilkan hasil yang tidak dijangka: "Mary pets kucing" dicetak untuk ketiga-tiga haiwan ("lembu", "anjing", dan "kucing"). Ini kerana sangkar pembolehubah setempat dalam fungsi pet_fungsi bersarang ditangkap sebagai sel penutupan.

Sel Penutupan

Apabila fungsi bersarang dicipta, ia merujuk kepada setempat pembolehubah dalam skop induk. Dalam kes ini, sangkar ialah satu-satunya pembolehubah bebas dalam pet_function dan terikat pada sel penutupan. Sel ini membenarkan fungsi mengakses pembolehubah skop luar walaupun selepas fungsi induk kembali.

Resolusi Skop

Walau bagaimanapun, masalah timbul apabila fungsi bersarang dilaksanakan. Nilai sangkar dilihat dalam skop sekeliling pada masa pelaksanaan, bukan definisi. Dalam kes kami, pada masa fungsi dipanggil, pembolehubah sangkar dalam skop sekeliling telah ditetapkan "kucing" sebagai nilai terakhirnya.

Penyelesaian

Untuk menyelesaikan kekaburan ini, kita perlu memecahkan penutupan dan menghalang fungsi bersarang daripada mengakses skop sekeliling secara langsung. Berikut ialah beberapa penyelesaian:

  • Fungsi Separa: Cipta fungsi separa dan ikat hujah yang diingini sebagai parameter kata kunci.
  • Skop Fungsi Baharu : Cipta fungsi bersarang baharu yang menangkap hujah yang diingini sendiri skop.
  • Nilai Lalai Mengikat: Ikat pembolehubah sebagai nilai parameter lalai kepada fungsi bersarang.

Dengan menggunakan penyelesaian ini, kami boleh memastikan bahawa fungsi bersarang mempunyai akses kepada pembolehubah setempat yang betul dan mengelakkan kekaburan dalam kod kami.

Atas ialah kandungan terperinci Bagaimanakah Penutupan Mempengaruhi Akses Pembolehubah Setempat dalam Fungsi Python Bersarang?. 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