Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi Python Bersarang Mengakses Pembolehubah pada Masa Pelaksanaan, Bukan Masa Definisi?
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!