Python中列表的奇怪行为

时间:2019-10-30 19:48:27

标签: python

我注意到probability_matrix尽管从未分配,但似乎变成了adapted_given_board

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)

1 个答案:

答案 0 :(得分: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)

或者您可以简单地添加新元素,而不是通过索引分配它们...

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)