Lokale Variablen in verschachtelten Funktionen

Okay, denk dran, ich weiß, es wird schrecklich verworren aussehen, aber bitte hilf mir zu verstehen, was passiert.

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()

Gibt:

cow: Mary pets the cat.
dog: Mary pets the cat.
cat: Mary pets the cat.

Also, warum bekomme ich nicht drei verschiedene Tiere? Ist das nichtcage 'gepackt' in den lokalen Bereich der verschachtelten Funktion? Wenn nicht, wie sucht ein Aufruf der verschachtelten Funktion nach den lokalen Variablen?

Ich weiß, dass solche Probleme normalerweise bedeuten, dass man es falsch macht, aber ich möchte verstehen, was passiert.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage