巢狀函數和局部變數存取
在Python中,巢狀函數可以從其封閉範圍存取局部變數。但是,此訪問的時間可能違反直覺。
考慮以下程式碼片段:
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()
輸出顯示“Mary pets”,而不是獲得Mary 撫摸每隻動物的預期輸出貓”代表所有三種動物。出現這種現象是因為巢狀函數pet_function 在執行時尋找局部變數cage,而不是在定義時尋找。會依序指派給每個動物循環內。
要解決這個問題,可以使用不同的技術,例如:
from functools import partial def pet_function(cage): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
def scoped_cage(cage): def pet_function(): print "Mary pets the " + cage.animal + "." return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
def pet_function(cage=cage): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, pet_function))
以上是為什麼巢狀 Python 函數在執行時而不是定義時存取變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!