0

I am from java background, I am learning python matrix operation. I have an assignment question to add two matrices manually I can't figure out the error in my logic. need help thank you

x = [[12,7,3],[4 ,5,6],[7 ,8,9]]  
y = [[5,8,1],[6,7,3],[4,5,9]]
row = len(x)
col = len(x[0])
ans = [[0] * col] * row
for i in range(len(x)):
    for j in range(len(x[i])):
            ans[i][j] = x[i][j] + y[i][j]
print()
print(ans)

output : [[11, 13, 18], [11, 13, 18], [11, 13, 18]]

1 Answers1

1

The problem is here:

ans = [[0]*col]*row

This statement creates row number of objects, where each object is [[0]*col]. What this means is that, each "sub-list" in the list is pointing to the same list.

(More information about this behaviour here: List of lists changes reflected across sublists unexpectedly)

You can verify that by checking the id values of ans[0],ans[1] and so on:

>>> a = [[0]*col]*row
>>> 
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(a[0])
140336190913992
>>> id(a[1])
140336190913992
>>> id(a[2])
140336190913992

This means, if we set a[0][1] = 10 (say), then EACH sub-list will have the the value 10 set. This is because all the lists point to the same list.

i.e.

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

Now, how do we avoid this? You can do so by initiliasing the ans list in a different way, as in:

b = [[0 for x in range(col)] for y in range(row)]

You can verify that all the sub-lists point to different addresses by using id again:

>>> id(b[0])
140336190512520
>>> id(b[1])
140336190765000
>>> id(b[2])
140336197031816

So now if you run your original program, you will get desired results.

TLDR; your modified program looks like this:

x = [[12,7,3],[4 ,5,6],[7 ,8,9]]  
y = [[5,8,1],[6,7,3],[4,5,9]]
row = len(x)
col = len(x[0])
ans = [[0 for x in range(col)] for y in range(row)]
for i in range(len(x)):
    for j in range(len(x[i])):
        ans[i][j] = x[i][j] + y[i][j]
print(ans)
Rahul Bharadwaj
  • 2,555
  • 2
  • 18
  • 29