speciali - Inizializza una lista di oggetti in Python




self in python (3)

Si noti che l'equivoco di Python per il codice Java (creando una matrice di 100 riferimenti null a Object):

Object arr = new Object[100];

o codice C ++:

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

è:

arr = [None]*100

non:

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

Il secondo sarebbe lo stesso di Java:

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

In effetti, le capacità di Python di inizializzare strutture dati complesse sono di gran lunga migliori di quelle di Java.

Nota: codice C ++:

Object *arr = new Object[100];

dovrebbe fare tanto lavoro quanto la comprensione delle liste di Python:

  • allocare memoria continua per 100 oggetti

  • chiama Object :: Object () per ciascuno di questi oggetti

E il risultato sarebbe una struttura di dati completamente diversa.

Sto cercando di inizializzare un array / elenco di oggetti che non sono vuoti - il costruttore della classe genera dati. In C ++ e Java vorrei fare qualcosa di simile a questo:

Object lst = new Object[100];

Ho scavato intorno, ma c'è un modo Python per fare questo?

Questo non funziona come pensavo sarebbe (ottengo 100 riferimenti allo stesso oggetto):

lst = [Object()]*100

Ma questo sembra funzionare nel modo in cui voglio:

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

La comprensione delle liste sembra (intellettualmente) come "un sacco" di lavoro per qualcosa che è così semplice in Java.


Penso che la comprensione delle liste sia il modo più semplice, ma, se non ti piace, ovviamente non è l'unico modo per ottenere ciò che desideri - chiamando un dato chiamabile 100 volte senza argomenti per formare i 100 elementi di un nuovo elenco. Ad esempio, itertools può ovviamente farlo:

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

oppure, se sei davvero un tradizionalista, map e apply :

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

Nota che questo è essenzialmente lo stesso (minuscolo, sia concettualmente che in realtà ;-) quantità di lavoro che ci vorrebbe se, invece di dover essere chiamato senza argomenti, Object doveva essere chiamato con un argomento - o, per esempio, se Object era in realtà una funzione piuttosto che un tipo.

Dalla tua sorpresa che potrebbe richiedere "tanto quanto la comprensione di una lista" per eseguire questo compito, sembra che ogni lingua debba avere il caso speciale per eseguire "chiamate a un tipo, senza argomenti" rispetto ad altri tipi di chiamate a per le calleble, ma non riesco a vedere cosa sia così cruciale e speciale in questo caso molto specifico, da giustificare che sia trattato in modo diverso da tutti gli altri; e, di conseguenza, sono abbastanza felice, personalmente, che Python non abbia escluso questo caso per trattamenti particolari e bizzarri, ma si comporta con la stessa regolarità e facilità di qualsiasi altro caso simile!)


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

Dato che un array è il suo oggetto di prima classe in python, penso che questo sia l'unico modo per ottenere ciò che stai cercando. * fa qualcosa di pazzo.





initialization