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()
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)))
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)))
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))
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!