Python unittest 更改变量似乎超出范围

我有以下井字游戏代码:


class TicTacToeBoard:

board = [[0,0,0], [0,0,0], [0,0,0]]


def printBoard(self):

    print(self.board)


def putPiece(self, position1, position2):

    self.board[position1][position2] = 1

我正在对代码进行单元测试,如下所示:


def testestablishTicTacToeBoard(self):

    test = TicTacToeBoard()

    self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])


def testPutPiece(self):

    test = TicTacToeBoard()

    self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])

    test.putPiece(1,1)

    self.assertEqual(test.board, [[0,0,0],[0,1,0],[0,0,0]])

在我进行第二个单元测试之前,第一个单元测试毫无问题地通过了。一旦我进行了第二个单元测试,第一个单元测试就不再通过:


self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])

AssertionError: Lists differ: [[0, 0, 0], [0, 1, 0], [0, 0, 0]] != [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

第二个单元测试中发生了什么导致第一个单元测试不再通过?


皈依舞
浏览 178回答 1
1回答

繁星coding

看起来这是因为板在所有实例之间共享(它是一个类属性,而不是一个实例属性)。您可以使用此更改您的类代码,它应该可以工作:class TicTacToeBoard:    def __init__(self):         # Now each instance (self) has its own board:             self.board = [[0,0,0], [0,0,0], [0,0,0]]    def printBoard(self):        print(self.board)    def putPiece(self, position1, position2):        self.board[position1][position2] = 1如果你想说服自己真正发生了什么,你可以比较两个版本(实例/类属性):class TicTacToeBoard:    shared_board = [[0,0,0], [0,0,0], [0,0,0]]    def __init__(self):        self.board = [[0,0,0], [0,0,0], [0,0,0]]    def __str__(self):        return (            f"Instance board: {self.board}\n"            f"Class board (shared): {self.shared_board}"         )    def putPiece(self, position1, position2):        self.board[position1][position2] = 1        self.shared_board[position1][position2] = 2>>> b1 = TicTacToeBoard()>>> b2 = TicTacToeBoard()>>> b1.putPiece(1, 2)>>> print(b1)Instance board: [[0, 0, 0], [0, 0, 1], [0, 0, 0]]Class board (shared): [[0, 0, 0], [0, 0, 2], [0, 0, 0]]>>> print(b2)Instance board: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]Class board (shared): [[0, 0, 0], [0, 0, 2], [0, 0, 0]]请注意第二个 tictactoe 板如何b2没有一个在 position(1, 2)而是在 position 处有两个(1, 2)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python