self.__board[:]
создает новый список, содержащий ссылки на все те же объекты, которые были в self.__board
. Поскольку self.__board
содержит списки, а списки являются изменяемыми, в итоге вы получаете два экземпляра s_board
с частично псевдонимами данных, и изменение одного влияет на другой.
Как предположил Рэймонд Хеттингер, вы можете использовать copy.deepcopy
, чтобы (в основном) гарантировать, что вы берете истинную копию объекта и не передаете какие-либо данные. В основном я говорю, поскольку считаю, что есть некоторые странные объекты, над которыми deepcopy
не будет работать, но для обычных вещей, таких как списки и простые классы, он будет работать нормально.
У меня есть дополнительное предложение. Вы вызываете b = s_board()
, что требует усилий для создания списков для новой пустой доски, а затем вы выбрасываете их, назначая b.__board
и b.__solved
. Кажется, что было бы лучше сделать что-то вроде следующего:
class s_board:
def __init__(self, board=None, solved=None):
if board is None:
self.__board = [[n for n in range(1, 10)] for m in range(81)]
else:
self.__board = copy.deepcopy(board)
if solved is None:
self.__solved = [False for m in range(81)]
else:
self.__solved = copy.deepcopy(solved)
def copy(self):
b = s_board(self.__board, self.__solved)
return b
Теперь, если вы позвоните A = s_board()
, вы получите новую пустую доску, а если вы позвоните A.copy()
, вы получите отличную копию A
, без необходимости выделять и затем сбрасывать новую пустую доску.