class Board: array = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]] def reset(self): self.array = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]] class AI(Board): def __init__(self): self.array[0][0] = "X" ai = AI() board = Board() print(ai.array) # [['X', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']] print(board.array) # [['X', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']] ai.reset() print(ai.array) # [[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']] print(board.array) # [['X', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']] My question is why board.array is changed while ai.array was. If they are connected to each other, why both the attributes are not changed together while the method belongs to AI is run.