Установка значений в матрицах — Python

Я сделал матрицу 5x3

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

Когда я хочу изменить одно поле

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**

Вместо одного изменения я получаю пять


person Ivan Vulović    schedule 13.04.2013    source источник
comment
Я просто хочу изменить одно поле, я не знаю почему, но таким образом он всегда меняет 5 полей (для полей [x] [y] он меняет весь столбец y, а не значение xy)   -  person Ivan Vulović    schedule 13.04.2013


Ответы (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]]
person UltraInstinct    schedule 13.04.2013

Это происходит потому, что каждая строка вашего списка ссылается на один и тот же объект, список с именем 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.

person David Heffernan    schedule 13.04.2013