Pregunta

Estoy buscando inicializar una matriz / lista de objetos que no están vacíos: el constructor de la clase genera datos. En C ++ y Java haría algo como esto:

Object lst = new Object[100];

He cavado por ahí, pero ¿hay alguna forma en Pythonic para hacer esto?

Esto no funciona como lo pensé (obtendría 100 referencias al mismo objeto):

lst = [Object()]*100

Pero esto parece funcionar de la manera que quiero:

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

La comprensión de la lista parece (intelectualmente) como " mucho " de trabajo para algo que es tan simple en Java.

¿Fue útil?

Solución

No hay una manera de llamar implícitamente a un constructor Object () para cada elemento de una matriz como existe en C ++ (recuerde que en Java, cada elemento de una nueva matriz se inicializa para null para los tipos de referencia).

Yo diría que su método de comprensión de lista es el más Pythonic:

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

Si no quiere pisar la variable léxica i , una convención en Python es usar _ para una variable ficticia cuyo valor no importa :

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

Para un equivalente de la construcción similar en Java, por supuesto puede usar * :

lst = [None] * 100

Otros consejos

Debes tener en cuenta que el valor de Python es igual al de Java. (creando una matriz de 100 nulas referencias al objeto):

Object arr = new Object[100];

o código C ++:

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

es:

arr = [None]*100

no:

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

El segundo sería el mismo que el de Java:

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

De hecho, las capacidades de Python para inicializar estructuras de datos complejas son mucho mejores que las de Java.


Nota: Código C ++:

Object *arr = new Object[100];

tendría que hacer tanto trabajo como la comprensión de la lista de Python:

  • asigne memoria continua para 100 objetos

  • llame a Object :: Object () para cada uno de estos Objetos

Y el resultado sería una estructura de datos completamente diferente.

Creo que la comprensión de la lista es la forma más sencilla, pero, si no te gusta, obviamente no es la única forma de obtener lo que deseas: llamar a un determinado número 100 veces sin argumentos para formar los 100 elementos. de una nueva lista. Por ejemplo, itertools obviamente puede hacerlo:

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

o, si realmente eres un tradicionalista, mapa y se aplican :

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

Tenga en cuenta que esta es esencialmente la misma (minúscula, tanto conceptual como en realidad ;-) la cantidad de trabajo que tomaría si, en lugar de necesitar ser llamado sin argumentos, se necesita llamar a Object con un argumento - o, digamos, si Object era en realidad una función en lugar de un tipo.

Por su sorpresa, podría tomar " tanto como una lista de comprensión " para realizar esta tarea, parece que piensa que cada idioma debe tener en cuenta la necesidad de realizar llamadas a un tipo, sin argumentos " sobre otros tipos de llamadas a reclamaciones en exceso, pero no veo qué es tan crucial y especial sobre este caso tan específico, para justificar el tratamiento diferente a todos los demás; y, como consecuencia, estoy muy contento, personalmente, de que Python no se dedique a este caso único para un tratamiento peculiar y extraño, sino que se maneja con la misma regularidad y facilidad que cualquier otro caso de uso similar -)

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

Dado que una matriz es su propio objeto de primera clase en Python, creo que esta es la única forma de obtener lo que está buscando. * hace algo loco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top