1

Python の * を使用して、デフォルト値 0 の 2 次元リスト [[0]*10]*10 を作成します。しかし、最初の要素を 1 に設定すると、最初の列のすべての要素が偶然 1 になりました。 ?

これは、append を使用してリストを作成した場合には発生しません (以下の variable data を参照)。

#!/bin/env python
#encoding=utf8

width = 10
height = 10

data = []
for i in xrange(width):
    data.append([0 for j in xrange(height)])

data2 = [[0]*width]*height

print "before:",data == data2
data[0][0] = 1
data2[0][0] = 1
print "after:",data == data2

print "actually:"
print data
print data2

出力:

before: True
after: False
actually:
[[1, 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]]
[[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]]
4

2 に答える 2

0

ここ:

[[0]*width]

単一のリストのみを作成してから、その単一のオブジェクトへの参照を[0]含む別のリストを作成します。width重要な点は、*演算子がそのオペランドを 1 回だけ評価することです。

ここ:

for i in xrange(width):
    data.append([0 for j in xrange(height)])

追加する各反復で新しいリストを作成しています。

于 2013-06-04T18:01:09.307 に答える