Frage

dict Methoden dict.keys(), dict.Objekte() und dict.Werte() return "Ansichten" statt Listen. http://docs.python.org/dev/3.0/whatsnew//3.0.html

Erste von alle, wie ein Blick unterscheiden sich von einem iterator?Zweitens, was ist der Vorteil von dieser änderung?Ist es nur für die performance-Gründen?

Es scheint nicht intuitiv zu mir, also, ich bin zu Fragen, für eine Liste von was (gib mir alle deine keys) und ich bin immer noch etwas anderes zurück.Dies wird die Leute verwirren?

War es hilfreich?

Lösung

Sie sind effektiv immer eine Liste.Es ist nicht nur eine Kopie der internen Liste, sondern etwas, das wirkt, als ob es wo eine Liste, sondern nur repräsentiert den internen Zustand.

Das ist die gleiche Art, wie es in Java implementiert (und wahrscheinlich viele andere Sprachen/Umgebungen).

Der Hauptgrund ist, dass für viele use cases Rückkehr eine völlig losgelöst Liste ist unnötig und verschwenderisch.Es würde erfordern, kopieren Sie den gesamten Inhalt (was kann oder viele nicht viel sein).

Wenn Sie wollen einfach nur, um zu iterieren über die Schlüssel, dann eine neue Liste zu erstellen ist nicht erforderlich.Und wenn Sie tatsächlich müssen es als eine separate Liste (als Kopie), dann können Sie leicht erstellen, die Liste aus dem Blick.

Andere Tipps

Joachim Sauer Antwort erklärt sehr gut, warum ein list nicht zurückgegeben werden.Aber es bleibt die Frage, warum diese Funktionen würden nicht zurückkehren, Iteratoren, wie iteritems etc.habe in Python 2.

Ein iterator ist viel restriktiver als ein container.Zum Beispiel, ein iterator erlaubt nicht mehr als einen pass;wenn Sie versuchen einen zweiten Durchgang, finden Sie es leer.Deshalb, Operationen wie elem in cont unterstützt von Containern, aber kann nicht unterstützt werden durch Iteratoren:nachdem Sie überprüfen, ob ein element ist "in" der iterator, iterator zerstört wird!

Auf der anderen Seite, immer ein container in der Regel erfordert eine Kopie zu erstellen, wie das erstellen einer Liste aus dem Wörterbuch keys.

Die view Objekt hat das beste aus beiden Welten:es verhält sich wie ein container, und doch nicht machen, wird eine Kopie des Wörterbuchs!Es ist in der Tat eine Art virtuelle read-only-container, der funktioniert durch die Verknüpfung der zugrunde liegenden dictionary.Ich weiß nicht, ob es gesehen, überall sonst in der standard-Python.

Edit:

@AntonyHatchkins:der Grund, warum es nicht wieder eine generator-Funktion ist, dass es nicht ermöglichen würde, für eine schnelle in Betrieb.Ja, in Werke für generator-Funktionen (wenn Sie Sie nennen).Das heißt, können Sie dies tun:

def f():
  for i in range(10):
    yield i

5 in f() # True

Aber nach der definition von in, wenn die Rechte Seite ist ein generator, python wird gehen durch alle n Elemente des Generators führt zu O(n) Zeit Komplexität.Es gibt nichts, was Sie dagegen tun können, denn das ist die einzig sinnvolle Verhalten einer beliebigen generator.

Auf der anderen Seite, im Fall des Wörterbuchs anzuzeigen, die Sie umsetzen können in so, wie Sie wollen, weil Sie wissen mehr über die Daten, die Sie verwalten.Und in der Tat in umgesetzt mit O(1) die Komplexität der Verwendung einer hash-Tabelle.Sie können es überprüfen, indem Sie ausführen

>>> d = dict(zip(range(50000000), range(50000000)))
>>> 49999999 in d
True
>>> 49999999 in iter(d) # kinda how generator function would work
True
>>>

und merken, wie schnell die ersten in im Vergleich zum zweiten in.

Wie bereits in der Frage, Ansicht len() Methode, die das iterator-fehlt (noch-Liste hat es).

Ein weiterer Vorteil der Rücksendung eine Ansicht anstelle einer Liste ist, dass zumindest für die der Schlüssel für eine optimierte Mitgliedschaft testen in O(1) Operationen anstelle von O(N) für die Liste (oder iterator).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top