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