亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號