Question

Je cherche à initialiser un tableau / une liste d'objets qui ne sont pas vides - le constructeur de la classe génère des données. En C ++ et Java, je ferais quelque chose comme ceci:

Object lst = new Object[100];

J'ai fouillé, mais y a-t-il un moyen pythonique de le faire?

Cela ne fonctionne pas comme prévu (je reçois 100 références pour le même objet):

lst = [Object()]*100

Mais cela semble fonctionner comme je le veux:

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

La compréhension de la liste semble (intellectuellement) ressembler à "beaucoup". de travail pour quelque chose qui est si simple en Java.

Était-ce utile?

La solution

Il n’existe aucun moyen d’appeler implicitement un constructeur Object () pour chaque élément d’un tableau comme en C ++ (rappelons qu'en Java, chaque élément d’un nouveau tableau est initialisé à null pour les types de référence).

Je dirais que votre méthode de compréhension de liste est la plus pythonique:

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

Si vous ne souhaitez pas utiliser la variable lexicale i , une convention en Python consiste à utiliser _ pour une variable factice dont la valeur n'a pas d'importance. :

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

Pour un équivalent de la construction similaire en Java, vous pouvez bien sûr utiliser * :

lst = [None] * 100

Autres conseils

Notez que l'équivalent de Python pour le code Java (création d'un tableau de 100 null références à Object):

Object arr = new Object[100];

ou code C ++:

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

est:

arr = [None]*100

pas:

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

Le second serait le même que celui de Java:

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

En fait, les capacités de Python pour initialiser des structures de données complexes sont bien meilleures que celles de Java.

Remarque: Code C ++:

Object *arr = new Object[100];

devrait faire autant de travail que la compréhension de la liste de Python:

  • allouer de la mémoire continue pour 100 objets

  • appelez Object :: Object () pour chacun de ces objets

Et le résultat serait une structure de données complètement différente.

Je pense que la compréhension de liste est la manière la plus simple, mais si vous ne l'aimez pas, ce n'est évidemment pas le seul moyen d'obtenir ce que vous désirez - appeler un appelable donné 100 fois sans argument pour former les 100 éléments d'une nouvelle liste. Par exemple, itertools peut évidemment le faire:

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

ou, si vous êtes vraiment traditionaliste, map et apply :

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

Notez qu’il s’agit essentiellement de la même chose (minuscule, conceptuellement et en réalité ;-). Il faudrait beaucoup de travail si, au lieu d’être appelé sans arguments, Object devait être appelé avec un argument - ou si, par exemple, Object était en fait une fonction plutôt qu'un type.

De votre surprise, cela pourrait prendre "autant que la compréhension d'une liste". pour effectuer cette tâche, vous semblez penser que chaque langue doit tenir compte de la nécessité d'effectuer des "appels à un type, sans argument". par-dessus d’autres types d’appels, mais je ne vois pas ce qui est si important et si spécial dans ce cas très particulier, pour pouvoir le traiter différemment de tous les autres; et, par conséquent, je suis plutôt heureux, personnellement, que Python ne se limite pas à ce cas particulier pour un traitement étrange et étrange, mais se traite tout aussi régulièrement et facilement que tout autre cas d'utilisation similaire! -)

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

Comme un tableau est un objet de première classe en python, je pense que c’est le seul moyen d’obtenir ce que vous recherchez. * fait quelque chose de fou.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top