Lokale Variablen in verschachtelten Funktionen

Okay, Bär mit mir, ich weiß, es sieht furchtbar kompliziert, aber bitte helfen Sie mir zu verstehen, was geschieht.

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 im Grunde, warum bin ich nicht immer drei verschiedene Tiere? Ist das nicht die cage 'verpackt' in den lokalen Umfang der verschachtelten Funktion? Wenn nicht, wie funktioniert ein Aufruf an die verschachtelte Funktion suchen die lokalen Variablen?

Ich weiß, dass das laufen in diese Art von Problemen in der Regel bedeutet, man ist 'etwas falsch', aber ich würde gerne verstehen, was passiert.

Versuchen for animal in ['cat', 'dog', 'cow']... ich bin sicher, wird jemand kommen und erklären, dies obwohl - es ist ein Python-gotcha 🙂

InformationsquelleAutor noio | 2012-09-14

Schreibe einen Kommentar