3

I made i matrix 5x3

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

When i want to change one field

fields[2][2] = 0

i get this:

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

Instead one change i am getting five

1
  • I just want to change one field, i dont know why but on this way he always change 5 fields ( for fields[x][y] he is changing whole y column not xy value) Commented Apr 13, 2013 at 14:37

2 Answers 2

2

Its because you have the reference to the same field across all rows.

You want this:

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

field should get reset for every row. That's why you should have it inside the first loop. Now your fields[2][2] = 0 would work.

>>> 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]]
Sign up to request clarification or add additional context in comments.

Comments

2

The reason this happens is that each row of your list refers to the same object, the list named field. You can see this by looking at the id of each row. You will find that:

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

and so on. Each row is in fact the same object.

You need to create a separate list for each row:

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

And now you will see that:

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

and so on. And your attempts to modify individual elements will behave as you intend.

But really, if you want to work with matrices, then you should use numpy.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.