Frage

Ich bin ein schauen, um einen Array / Liste der Objekte zu initialisieren, die nicht leer sind - die Klasse Konstruktor erzeugt Daten. In C ++ und Java würde ich etwas tun, wie folgt aus:

Object lst = new Object[100];

Ich habe um gegraben, aber gibt es einen Pythonic Weg, dies zu tun bekommen?

Das funktioniert nicht, wie ich dachte, es wäre (I 100 Referenzen auf das gleiche Objekt erhalten):

lst = [Object()]*100

Dies scheint aber in der Art und Weise zu arbeiten, ich will:

lst = [Object() for i in range(100)]

Liste Verständnis scheint (intellektuell) wie „viel“ Arbeit für etwas, das in Java so einfach ist.

War es hilfreich?

Lösung

Es gibt keine Art und Weise implizit für jedes Element eines Arrays einen Object() Konstruktor aufzurufen, wie es in C ++ (man erinnere sich, dass in Java, jedes Element einer neuen Array initialisiert wird für Referenztypen null).

Ich würde sagen, dass Ihre Liste Verständnis Methode ist die Pythonic:

lst = [Object() for i in range(100)]

Wenn Sie nicht auf die lexikalische Variable i Schritt wollen, dann in Python eine Konvention ist _ für eine Dummy-Variable, deren Wert zu verwenden, spielt keine Rolle:

lst = [Object() for _ in range(100)]

Für eine Äquivalent des ähnlichen Konstrukts in Java, können Sie natürlich Verwendung *:

lst = [None] * 100

Andere Tipps

Sie sollten beachten, dass Pythons Vorbehalte, für Java-Code (Schaffung Array von 100 null Verweise auf Objekt):

Object arr = new Object[100];

oder C ++ Code:

Object **arr = new Object*[100];

ist:

arr = [None]*100

nicht:

arr = [Object() for _ in range(100)]

Die zweite wäre das gleiche wie Java sein:

Object arr = new Object[100];
for (int i = 0; i < arr.lenght; i++) {
    arr[i] = new Object();
}

In der Tat Fähigkeiten Pythons komplexe Datenstrukturen zu initialisieren sind weit besser als Java.


Hinweis: C ++ Code:

Object *arr = new Object[100];

hätte so viel Arbeit wie Python Liste Verständnis tun:

  • zuteilen Dauerspeicher für 100 Objekte

  • Aufruf Objekt :: Object () für jedes dieser Objekte

Und das Ergebnis wäre eine ganz andere Datenstruktur sein.

Ich denke, die Liste Verständnis der einfachste Weg ist, aber, wenn Sie es nicht mögen, es ist natürlich nicht der einzige Weg, um zu erhalten, was Sie wünschen - eine gegebene aufrufbar 100 mal ohne Argumente aufrufen, die 100 Elemente zu bilden einer neuen Liste. Zum Beispiel itertools kann es offensichtlich tun:

>>> import itertools as it
>>> lst = list(it.starmap(Object, it.repeat((), 100)))

oder, wenn Sie wirklich ein Traditionalist, map und apply:

>>> lst = map(apply, 100*[Object], 100*[()])

Beachten Sie, dass dies im Wesentlichen die gleiche (winzige, sowohl konzeptionell als auch tatsächlich ;-) Menge an Arbeit, wenn es dauern würde, statt der Notwendigkeit ohne Argumente aufgerufen werden, Object benötigt, um mit einem Argument aufgerufen werden - oder, sagen wenn Object ist in der Tat eine Funktion eher als eine Art.

Von Ihrer Überraschung, dass es dauern kann „so viel wie eine Liste Verständnis“ diese Aufgabe zu erfüllen, scheinen Sie zu glauben, dass jede Sprache sollte eine spezieller Fall die Notwendigkeit, „auf eine Art aufruft, ohne Argumente“ führen über andere Arten von ruft Callables auf über, aber ich sehe nicht, was so wichtig ist und das besondere an diesem sehr speziellen Fall zu rechtfertigen es anders von allen anderen zu behandeln; und, als Folge, ich ist ziemlich glücklich, persönlich, dass Python nicht diesen einen Fall nicht heraus für besondere und seltsame Behandlung, aber Griffe ebenso regelmäßig und einfach wie jeder anderen ähnlichen Anwendungsfall! -)

lst = [Object() for i in range(100)]

Da ein Array seine eigene erste Klasse Objekt in Python ist ich denke, das ist der einzige Weg zu bekommen, was Sie suchen. * Tut etwas verrückt.

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