Локальные переменные во вложенных функциях

Хорошо, потерпите меня, я знаю, что это будет выглядеть ужасно запутанным, но, пожалуйста, помогите мне понять, что происходит.

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; в локальную область вложенной функции? Если нет, то как вызов вложенной функции ищет локальные переменные?

Я знаю, что столкновение с такими проблемами обычно означает, что кто-то «делает это неправильно», но я хотел бы понять, что происходит.

Ответы на вопрос(3)

Ваш ответ на вопрос