为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2021-12-21 15:08:39
我有以下井字游戏代码: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]]第二个单元测试中发生了什么导致第一个单元测试不再通过?
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

看起来这是因为板在所有实例之间共享(它是一个类属性,而不是一个实例属性)。


您可以使用此更改您的类代码,它应该可以工作:


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)。


查看完整回答
反对 回复 2021-12-21
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号