When you are executing [[0] * columns] * rows you're basically generating a list of 3 references to the same list.
It is equivalent to the following code:
a = [0, 0, 0] # a = [0] * columns
result = [a, a, a] # result = [a] * rows
Therefore when you do result[0], result[1] and result[2] you're actually referencing the same underlying memory as a. Since they all are referencing to the same object, when you do the last three lines:
[2][0]: 2 + 8 = 10
[2][1]: 2 + 2 = 4
[2][2]: 8 + 6 = 14
You're basically modifying the same underlying entity, a (in our case). If you want to allow the result array programmatically, then you'll have to do
result = [[0] * columns for _ in range(rows)]
Interested in learning Python? Enroll in our Python Course now!