57

Python には配列型はありませんが、それをエミュレートするためにリストを使用できます。ゼロで埋められた 2 次元配列のような構造が必要です。私の質問は次のとおりです。この 2 つの式に違いがあるとすれば、それは何ですか。

zeros = [[0 for i in xrange(M)] for j in xrange(M)]

zeros = [[0]*M]*N

zeros同じになりますか?速度と読みやすさの点でどちらを使用するのが良いですか?

4

4 に答える 4

90

を使用する必要がありますnumpy.zeros。それがオプションでない場合は、最初のバージョンが必要です。2番目のバージョンでは、1つの値を変更すると、リストの他の場所で変更されます。例:

>>> a = [[0]*10]*10
>>> a
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

これは、(式を裏返しに読むときに)10個のゼロのリストを作成するためです。次に、10個のゼロの初期リストへの10個の参照のリストを作成します。


ご了承ください:

zeros = [ [0]*M for _ in range(N) ]  # Use xrange if you're still stuck in the python2.x dark ages :).

も機能し、ネストされたリスト内包を回避します。numpyがテーブルにない場合、これは私が使用するフォームです。

于 2012-10-31T12:29:52.643 に答える
22

2 番目のケースでは、同じリストへの参照のリストを作成します。次のようなコードがある場合:

[lst] * N

lstリストへの参照である場合、次のリストが表示されます。

[lst, lst, lst, lst, ..., lst]

ただし、結果リストには同じオブジェクトへの参照が含まれているため、1 つの行の値を変更すると、他のすべての行でも変更されます。

于 2012-10-31T12:39:22.157 に答える