3 Stimmen

Ich versuche, den Python-Memoisierungscode zu verstehen

In einer kürzlich erschienenen Hacker-Newsletter Problem, dieser sehr nützliche Artikel über Dekoratoren in Python verlinkt wurde. Ich mag den Artikel und ich denke, ich verstehe die meisten der Dekoratoren-Beispiele. Allerdings, in der Nicht-Dekorator Memoisierung Beispiel, ich bin sehr verwirrt durch den Code:

def memoize(fn):
    stored_results = {}

    def memoized(*args):
        try:
            # try to get the cached result
            return stored_results[args]
        except KeyError:
            # nothing was cached for those args. let's fix that.
            result = stored_results[args] = fn(*args)
            return result

    return memoized

Ich bin verwirrt, wie diese Funktion ein dauerhaftes Wörterbuch erstellen würde stored_results der angehängt wird. Nach erneutem Lesen, Kopieren/Einfügen in meinen Editor und Spielen mit ihm, und online nach Hilfe suchen, verstehe ich immer noch nicht, was die Syntax stored_results[args] = fn(*args) wirklich tut.

(1) Der Artikel schlägt vor, dass der obige Code die Funktion zurückgibt, aber dass er nun zuerst ein Wörterbuch durchsucht, bevor er auf neuen Argumenten ausgeführt wird. Wie kann dies geschehen? Warum wird nicht stored_results nur in der Nähe von memoize ? Warum wird es nicht zerstört, wenn memoized zurückgegeben wird?

(2) Links zu anderen Fragen oder Webressourcen, die das hier dargelegte Argument mit *args wäre ebenfalls hilfreich. Wenn *args ist eine Liste von Argumenten, warum können wir die Syntax stored_results[args] wenn Sie normalerweise einen nicht verschlüsselbaren Fehler erhalten, wenn Sie versuchen, ein Wörterbuch auf einer Liste zu indizieren?

Danke für alle klärenden Gedanken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X