Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Fungsi Python Bersarang Mengakses Pembolehubah pada Masa Pelaksanaan, Bukan Masa Definisi?

Mengapa Fungsi Python Bersarang Mengakses Pembolehubah pada Masa Pelaksanaan, Bukan Masa Definisi?

Patricia Arquette
Lepaskan: 2024-12-24 13:27:30
asal
918 orang telah melayarinya

Why Do Nested Python Functions Access Variables at Execution Time, Not Definition Time?

Fungsi Bersarang dan Akses Pembolehubah Setempat

Dalam Python, fungsi bersarang boleh mengakses pembolehubah setempat daripada skop tertutupnya. Walau bagaimanapun, masa akses ini boleh berlawanan dengan intuitif.

Pertimbangkan coretan kod berikut:

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

Daripada mendapatkan output yang dijangkakan di mana Mary memelihara setiap haiwan, output menunjukkan "Haiwan peliharaan Mary kucing" untuk ketiga-tiga haiwan. Tingkah laku ini timbul kerana fungsi bersarang pet_function mencari sangkar pembolehubah tempatan pada masa pelaksanaan, bukan pada masa definisi.

Apabila fungsi get_petters dipanggil, sangkar pembolehubah tempatan ditetapkan kepada setiap haiwan secara berturut-turut dalam gelung. Walau bagaimanapun, pada penghujung fungsi, sangkar mengandungi nilai terakhir ('kucing'). Apabila fungsi yang dikembalikan oleh get_petters dipanggil, mereka semua mengakses pembolehubah sangkar yang sama dengan nilai 'kucing'.

Untuk menangani isu ini, seseorang boleh menggunakan teknik yang berbeza, seperti:

  • Menggunakan fungsi separa dengan sangkar terikat pembolehubah:

    from functools import partial
    
    def pet_function(cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
    Salin selepas log masuk
  • Mencipta skop baharu untuk fungsi bersarang:

    def scoped_cage(cage):
      def pet_function():
          print "Mary pets the " + cage.animal + "."
      return pet_function
    
    yield (animal, partial(gotimes, scoped_cage(cage)))
    Salin selepas log masuk
  • Mengikat pembolehubah sebagai nilai lalai untuk parameter kata kunci:

    def pet_function(cage=cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, pet_function))
    Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Fungsi Python Bersarang Mengakses Pembolehubah pada Masa Pelaksanaan, Bukan Masa Definisi?. 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