2016-12-05 6 views
2

Wenn Sie diese Liste Verständnis:Liste Comprehensions und eine Zeile für Schleifen

squares = [x**2 for x in range(100000)] 

Es wäre viel Speicherplatz einnehmen, so könnte man das Gleiche mit einem Generator tun:

squares = (x**2 for x in range(100000)) 

lassen Sie uns jetzt sagen, dass ich nur eine einzige Zeile verwenden möchten for-Schleife alle diese Plätze zu drucken:

[print(square) for square in squares] 

Meine Frage ist: Wird auf diese Weise eine Liste erstellt (sieht wie ein Listenverständnis aus)? Wenn ja, wird diese Liste im Speicher gespeichert? (Wenn ja, würde es keinen Sinn machen, einen Generator zu verwenden, wenn die squares zu schaffen, weil die ohnehin in der anderen Liste gespeichert bekommen.) Und noch etwas: Wenn Sie dies tun:

[1, 2, 3, 4, 5, 6] 

ohne es zu zuweisen Werden diese Werte für irgendeine Variable im Speicher gespeichert?

Antwort

3

Ohne es zu einem Namen der Liste zuweisen nicht im Speicher gespeichert bekommen, da keine gibt es Referenz es hält (zunächst Speicher wird dafür zugewiesen werden, sondern Es wird sofort freigegeben, da (C) Python sehen kann, dass Sie es nicht benutzen *).

Darüber hinaus ist, Drucken mit:

[print(square) for square in squares] 

ist höchst ineffizient; Sie verwenden eine Liste-Verständnis nur für die Nebeneffekt Drucken, eine Liste, die das Ergebnis der print Funktionsaufruf enthält (seinen Rückgabewert) ist ausgefüllt.

Das bedeutet, Sie werden am Ende mit einer Liste von None 's, die erstellt wird, nur um ausgegeben werden, nicht viel Verwendung darin.

Sie sind besser dran mit einem Generator mit einer for Schleife als @ user312016 schlägt in seiner Antwort. Der Generator wird bei Bedarf liefern, und es wird keine zusätzliche Liste erstellt.

* Im interaktiven Modus sind die Dinge anders, da Sie den Namen _ als den Namen des letzten berechneten Ausdrucks verwendet haben. Dort wird die Liste gespeichert, bis der nächste Ausdruck den an _ angehängten Wert überschreibt.

+1

Eine wichtige Anmerkung, sie werden immer noch im Speicher von dem Interpreter erstellt und dann durch den Müllsammler wegen des Fehlens von Referenzen zerstört. – user312016

+1

Ja ja @ user312016, deshalb habe ich * geschrieben "anfänglich wird Speicher zugewiesen, aber es wird sofort freigegeben, da Python sehen kann, dass du es nicht verwendest" * :-). Ich interpretierte OPs "im Speicher gespeicherte Fragen" als Frage, ob der Speicher tatsächlich * nach * der Anweisung ausgeführt wird.(im interaktiven Modus '_' hält es herum, aber das ist eine Ausnahme) –

+0

Woops, ich habe diesen Teil vermisst – user312016

2

Ja, dies ist ein list erstellen und es ist im Speicher gespeichert, sollten Sie nicht Listenergänzungen als einzelne Zeilen für Schleifen verwenden, das ist nicht, was sie sind.

Sie tun könnte.

for square in (x**2 for x in range(100000)): 
    print(square) 
Verwandte Themen