Локальные переменные во вложенных функциях
Хорошо, потерпите меня, я знаю, что это будет выглядеть ужасно запутанным, но, пожалуйста, помогите мне понять, что происходит.
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
& APOS; упаковывают & APOS; в локальную область вложенной функции? Если нет, то как вызов вложенной функции ищет локальные переменные?
Я знаю, что столкновение с такими проблемами обычно означает, что кто-то «делает это неправильно», но я хотел бы понять, что происходит.