3

私はマトリックス5x3を作りました

field = []
fields = []
    for i in range(0,5):
        for j in range(0,3):
            x = 1
            field.append(x)
    fields.append(field)

1 つのフィールドを変更したい場合

fields[2][2] = 0

私はこれを得る:

fields[0][0] = 1
fields[0][1] = 1
fields[0][2] = **0**
fields[1][0] = 1
fields[1][1] = 1
fields[1][2] = **0**
fields[2][0] = 1
fields[2][1] = 1
fields[2][2] = **0**
fields[3][0] = 1
fields[3][1] = 1
fields[3][2] = **0**
fields[4][0] = 1
fields[4][1] = 1
fields[4][2] = **0**

代わりに 1 つの変更が 5 つ取得されます

4

2 に答える 2

2

fieldこれは、すべての行で同じへの参照があるためです。

あなたはこれを求めている:

for i in range(0,5):
    field = []
    for j in range(0,3):
        x = 1
        field.append(x)
    fields.append(field)

field行ごとにリセットする必要があります。そのため、最初のループ内に配置する必要があります。今、あなたfields[2][2] = 0はうまくいくでしょう。

>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> fields[2][2] = 0
>>> fields
[[1, 1, 1], [1, 1, 1], [1, 1, 0], [1, 1, 1], [1, 1, 1]]
于 2013-04-13T14:35:40.833 に答える
2

これが発生する理由は、リストの各行が同じオブジェクト、という名前のリストを参照しているためfieldです。idこれは、各行の を見るとわかります。次のことがわかります。

id(fields[0]) == id(fields[1])
id(fields[0]) == id(fields[2])

等々。実際、各行は同じオブジェクトです。

行ごとに個別のリストを作成する必要があります。

fields = []
for i in range(0,5):
    field = []
    for j in range(0,3):
        x = 1
        field.append(x)
    fields.append(field)

そして今、あなたはそれを見るでしょう:

id(fields[0]) != id(fields[1])

等々。また、個々の要素を変更しようとすると、意図したとおりに動作します。

しかし、実際には、行列を操作したい場合は、numpy を使用する必要があります。

于 2013-04-13T14:35:29.430 に答える