Хорошо, медведь со мной на этом, я знаю, что это будет выглядеть ужасно запутанным, но, пожалуйста, помогите мне понять, что происходит.
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()
дает:
cow: Mary pets the cat.
dog: Mary pets the cat.
cat: Mary pets the cat.
Итак, в основном, почему я не получаю трех разных животных? Разве не cage
'упакован' в локальную область вложенной функции? Если нет, то как вызов вложенной функции ищет локальные переменные?
Я знаю, что выполнение таких проблем обычно означает, что один из них "делает это неправильно", но я хотел бы понять, что происходит.