'Replacing char in [row][col] index replaces all characters in col [duplicate]

Currently I am trying to place a word in a column of 2D array in Python 3.6

    def __init__(self) -> None:
        self.board = [["."] * 10] * 10
        self.board[0][0] = 'T'

    def printBoardToTerminal(self):
        for index in range(0,10):
            print()
            print(self.board[index], end=" ")

Expected:

['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']

Actual:

['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']
['T', '.', '.', '.', '.', '.', '.', '.', '.', '.']

I thought it was a printing error but when I print(self.board) it also shows that the first element in each row is 'T'.

Edit: I tried doing the same above with the numpy library instead creating a 2D array of characters and then the replacement works as expected but with the above implementation still not sure whats going on there :/



Solution 1:[1]

This is because list multiplication [] * n does not create new data, but pseudo copies the list as a reference. Use list comprehension:

self.board = [["." for a in range(10)] for b in range(10)]

Using [["."] * 10] * 10 does not create new data, but copies the reference to the list ["."] 10 times


Edit as pointed out by ShadowRanger

The following is also acceptable:

self.board = [["."] * 10 for x in range(10)]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1