如何反转列表中的给定布尔值?

时间:2018-09-17 04:16:01

标签: python list boolean

我正在尝试解决Lights Out难题。我使用布尔值的二维列表(例如String brackets = "[\\[\\]]"; ProductList.productAdded.get(i).keySet().toString().replaceAll(brackets,""); )来表示光源的状态。 我想反转给定位置(例如(1,1))的布尔值,我的代码为:

[[True, True, True], [True, True, True], [True, True, True]]

我在上调用perform_move(1,1)

class LightsOutPuzzle(object):

    def __init__(self, board):
        self.board = board

    def get_board(self):
        return self.board

    def perform_move(self, row, col):      
        self.board[row][col] = not self.board[row][col]
        print(self.board)
        return LightsOutPuzzle(self.board)

但结果是:

[[False, False, False], [False, False, False], [False, False, False]]

这让我感到困惑。你能告诉我这是怎么回事吗?什么是完成此任务的正确方法? 非常感谢您的帮助!

我正在使用此功能来生成新板子:

[[False, True, False], [False, True, False], [False, True, False]]

是否会引起问题?

非常感谢您的答复!!! QWQ

2 个答案:

答案 0 :(得分:1)

我在您的代码中看到的探测语句位于函数 def create_puzzle(rows,cols)

def create_puzzle(行,列):

c = []
r = []

for x in range(cols):  
    c.append(False)    #Statement1

for y in range(rows):  
    r.append(c)        #Statement2

return LightsOutPuzzle(r)

Statement1:将元素追加到列表#[False,False,False] 假设id(c)为0x1000

Statement2:此语句会将相同列表(c)追加到rowList 结果(参考ID):[0x1000、0x1000、0x1000]

所以您的行将引用相同的List,这就是当您在List列之一中进行更改的原因,它也会反映在所有其他Lists列中。

更改您的create_puzzle

def create_puzzle(行,列):

     myBoard = [[False]*cols for i in range(rows)]
     return LightsOutPuzzle(myBoard )

答案 1 :(得分:0)

您可以在 init 方法内部进行操作,然后更改perform_move方法, 试试这个

class LightsOutPuzzle(object):

def __init__(self, board):
    self.board = board
    board = [not i for i in board]
    print(board)

def get_board(self):
    return self.board

def perform_move(self, row, col):
    self.board[row][col] = not self.board[row][col]
    print(self.board)
    return LightsOutPuzzle(self.board)

def main():
    LightsOutPuzzle([False, False, False])


if __name__ == '__main__':
    main()