web-dev-qa-db-ja.com

Python)でオブジェクトのリストを初期化します

空ではないオブジェクトの配列/リストを初期化しようとしています-クラスコンストラクターがデータを生成します。 C++およびJavaでは、次のようにします。

Object lst = new Object[100];

私は掘り下げましたが、これを行うためのPythonの方法はありますか?

これは思ったようには機能しません(同じオブジェクトへの参照が100個取得されます)。

lst = [Object()]*100

しかし、これは私が望む方法で機能するようです:

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

リスト内包表記は、(知的に)Javaで非常に単純なものの「多くの」作業のように見えます。

16
bradreaves

C++のように、配列の各要素に対してObject()コンストラクターを暗黙的に呼び出す方法はありません(Javaでは、新しい配列の各要素がnullに初期化されることを思い出してください。参照タイプの場合)。

私はあなたのリスト内包法が最もPythonicであると言うでしょう:

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

字句変数iを踏まない場合、Pythonの規則は、値がないダミー変数に_を使用することです。案件:

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

Javaの同様の構造に相当するものについては、もちろん*を使用できます。

lst = [None] * 100
35
Greg Hewgill

PythonのJavaコード(100の配列の作成nullオブジェクトへの参照))に相当することに注意してください。

Object arr = new Object[100];

またはC++コード:

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

は:

arr = [None]*100

ない:

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

2番目はJavaのものと同じです:

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

実際、複雑なデータ構造を初期化するPythonの機能は、Javaの機能よりもはるかに優れています。


注:C++コード:

Object *arr = new Object[100];

pythonのリスト内包表記と同じくらい多くの作業を行う必要があります。

  • 100個のオブジェクトに連続メモリを割り当てる

  • このオブジェクトごとにObject :: Object()を呼び出します

その結果、データ構造が完全に異なります。

13

リスト内包表記が最も簡単な方法だと思いますが、それが気に入らない場合は、それがあなたが望むものを取得する唯一の方法ではないことは明らかです-引数なしで特定の呼び出し可能オブジェクトを100回呼び出して、新しい100項目を形成しますリスト。たとえば、itertoolsは明らかにそれを行うことができます。

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

または、あなたが本当に伝統主義者なら、mapapply

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

これは、引数なしで呼び出す必要があるのではなく、1つの引数でObjectを呼び出す必要がある場合に必要な作業量と本質的に同じ(概念的にも実際的にも;-)であることに注意してください-またはたとえば、Objectが実際には型ではなく関数だった場合。

このタスクを実行するには「リスト内包表記と同じくらい」かかるかもしれないという驚きから、すべての言語は、他の種類の呼び出しよりも「引数なしで型の呼び出し」を実行する必要がある場合に特別な場合があると考えているようです。呼び出し可能オブジェクトを超えていますが、この非常に特殊なケースについて、他のすべてのケースとは異なる方法で処理することを保証するために、何がそれほど重要で特別なのかわかりません。その結果、個人的には、Pythonは、この1つのケースを独特で奇妙な扱いに限定するのではなく、他の同様のケースと同じように定期的かつ簡単に処理できることを非常に嬉しく思います。使用事例!-)

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

配列はpythonの独自のファーストクラスオブジェクトであるため、これが探しているものを取得する唯一の方法だと思います。*何かおかしなことをします。

0
Paul Huff