2

我正在编写一个片段来查找矩阵的行列式。矩阵表示为嵌套列表,例如,

[[2,3],[5,6]]

其中外部列表​​的成员是行,内部列表的成员是列。

在必须通过删除一些元素将矩阵扩展为更简单的矩阵的步骤中,我必须将原始列表的备份保存到另一个列表“bak”以在后续扩展中使用它。

但是在第一个扩展步骤之后,当我尝试从“bak”恢复原始列表的值时,似乎对原始列表的操作也反映在“bak”上。

def determinant(matrix):
        if len(matrix)==2:
                det = matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1]
        if len(matrix)>2:
                flag=0
                bak=[]
                for x in matrix:
                        bak.append(x)
                dump=[]

                for ind,x in enumerate(matrix):
                        matrix.pop(ind)
                        for n,y in enumerate(matrix):
                                matrix[n].pop(ind)

                        dump.append(matrix)
                        print "bak",bak
                        matrix=bak

matrix=[[1,2,3],[4,5,6],[7,8,9]]
determinant(matrix)

在打印“bak”时,输出是 [[1, 2, 3], [5, 6], [8, 9]] 应该是 [[1,2,3],[4,5,6 ],[7,8,9]]

如果我监督任何概念,请帮助我。

4

2 回答 2

4

您只存储对原始列表的引用。您想创建副本

bak.append(x[:])

或者

bak.append(list(x))

[:]语法从原始列表的第一个元素到最后一个元素的切片创建一个新列表。

于 2013-06-30T12:09:00.267 回答
2

(您似乎有点不知所措。为什么要拥有所有这些全局变量?在尝试执行此类操作之前,首先要了解函数如何正常工作。)

因为它不是真正的副本。bak是一个单独的列表列表matrix,但它包含所有相同的列表matrix

此外,每次通过外循环时,您都matrix将从bak...“恢复”,但不是通过制作副本,只是给它起别名!因此,在第二次通过循环时,您最终会matrix命名相同的列表列表bak,而现在预期的“备份”目的被打败了。

但是,解决这个问题的整个方法是错误的。停止尝试“复制然后反复修改”,而开始“反复制作修改版”

不要再试图告诉 Python 如何组合列表。它知道怎么做。

当我们将小任务分离成它们自己的函数时,代码变得更加简单。首先,让我们创建一个函数,为我们提供一个列表,其中包含除指定元素之外的所有内容:

def all_except(a_list, index):
    return a_list[:index] + a_list[index + 1:]

这使我们可以轻松地创建一个函数,该函数为我们提供了一个矩阵,其中包含除了指定的行和列之外的所有内容 - 通过请求“对于除指定行之外的每一行,没有指定列的行的副本”:

def submatrix(matrix, r, c):
    return [all_except(row, c) for row in all_except(matrix, r)]
    # Alternatively:
    # return [all_except(row, c) for i, row in enumerate(matrix) if i != r]

现在我们实际上可以进行递归了。没有必要实际建立未成年人名单。

def determinant(matrix):
    if len(matrix) < 2: raise ValueError

    if len(matrix) == 2:
        return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]

    return sum(
        column * (-1 ** r + c) * determinant(submatrix(matrix, r, c))
        for r, row in matrix
        for c, column in row
    )
于 2013-06-30T12:25:54.433 回答