带有python中列表的奇怪行为

问题描述 投票:0回答:1

[我注意到,即使从没有给概率_矩阵赋值,它似乎也变成了适应_给定的木板。

def build_probability_matrix(self):
    r = 0
    p = -1
    adapted_given_board = self.probability_matrix
    print(self.game.board.given_board)
    for i in range(len(self.game.board.given_board)-1):
        p += 1
        if self.game.board.given_board[i] == '\n':
            r += 1
            p = -1
        else:
            adapted_given_board[r][p] = self.game.board.given_board[i]
    print(adapted_given_board)
python
1个回答
0
投票

此作业:

adapted_given_board = self.probability_matrix

是参考,不是副本。也就是说,您正在为self.probability_matrix创建一个新名称,而不是具有内容副本的新列表。

所以当您这样做:

adapted_given_board[r][p] = self.game.board.given_board[i]

与您完成的操作完全相同:

self.probability_matrix[r][p] = self.game.board.given_board[i]

由于要使用二维列表,因此请谨慎使用copy进行修复;您可能最终只是将问题向下推了一层。这里有deepcopy之类的东西,但这是一个非常小的修正的想法,该修正只在分配新条目之前在矩阵中分配它们:

def build_probability_matrix(self):
    r = 0
    p = -1
    adapted_given_board = [[]]  # start with one row that has zero cells
    print(self.game.board.given_board)
    for i in range(len(self.game.board.given_board)-1):
        p += 1
        adapted_given_board[r].append(None)  # add a cell
        if self.game.board.given_board[i] == '\n':
            r += 1
            adapted_given_board.append([])   # add a row
            p = -1
        else:
            adapted_given_board[r][p] = self.game.board.given_board[i]
    print(adapted_given_board)

或者您可以始终省去rp,因为您总是将其添加到末尾...

def build_probability_matrix(self):
    adapted_given_board = [[]]        
    print(self.game.board.given_board)
    for element in self.game.board.given_board:
        if element == '\n':
            adapted_given_board.append([])
        else:
            adapted_given_board[-1].append(element)
    print(adapted_given_board)
© www.soinside.com 2019 - 2024. All rights reserved.