我已经复制了 list ,并对其执行了某些操作。但在一点之后,真正的矩阵,即列表受到影响

I have made a copy of the list , and have executed certain operations on it. But after a point the real matrix ,that is the list gets affected

执行代码查找矩阵的逆时出错(通过使用列表作为数组的高斯消元法)。为了使用行操作找到逆,首先我复制了矩阵并尝试在对角线上的零元素的情况下交换行然后尝试执行函数使矩阵的下三角区域全为0,即转换为行梯队形式。但此时代码也影响了原始矩阵。 (保留矩阵副本的原因是检查矩阵 A 乘以其找到的逆矩阵)

我尝试调试并发现操作影响原始矩阵的位置(在下面的代码中引用为注释)。但仍然无法弄清楚我哪里出错了。新鲜的眼睛真的很有帮助。

    A = [[2,4], 
         [3,0]] 

    def inverse(A):
        A_id = A[:]       #appling operations on a copy of matrix A   
        A_id = squaremat(A_id)
        indentitymat=identity(A_id)

        return (lowertriangle(A_id,indentitymat))


    def squaremat(A_id):       
        for i in range(len(A_id)):          
            if len(A_id)!=len(A_id[i]):
                error="Sorry Matrix not invertible" # checks given matrix is a square matrix
                return error
                break
        return swap(A_id)

    def swap(A_id):
            for j in range(len(A_id)):            
                if j!=len(A_id)-1 and A_id[j][j]==0:     
                    Temp= A_id[j]  
                    A_id[j]=A_id[j+1]
                    A_id[j+1]=Temp  
                elif j == len(A_id)-1 and A_id[j][j]==0:
                    Temp1= A_id[0]
                    A_id[0]=A_id[j]
                    A_id[j]=Temp1
            for k in range(len(A_id)):
                if A_id[k][k]==0:
                    return swap(A_id)
            return A_id

    def identity(A_id):
        iden=[]
        for i in range(len(A_id)):
            iden.append([0]*len(A_id))
            iden[i][i]=1  
        return iden

    def lowertriangle(A_id,invert):
        print(A_id)
        for i in range(len(A_id)):
            divisor = A_id[i][i]
            for j in range(len(A_id)):
                if divisor!=0:
                    A_id[i][j]=A_id[i][j]/divisor # to make diagonal one 
                    invert[i][j]=invert[i][j]/divisor

            for p in range(len(A_id)):
                if p>i:
                    multiplier=A_id[p][i]
                    for k in range(len(A_id)):                   
                        A_id[p][k] = A_id[p][k] - multiplier*A_id[i][k] # to make the lower triangle all zero, (here the original matrix is being affected)
                        invert[p][k] = invert[p][k] - multiplier*invert[i][k]

        print(A)

        return uppertriangle(A_idlower,invert)

    def uppertriangle(A_idlower,invert):
        for i in range(len(A_idlower)):
            for j in range(len(A_idlower)):
                if j<i:
                    multiplier2= A_idlower[j][i]
                    for k in range(len(A_idlower)):
                        A_idlower[j][k] = A_idlower[j][k] - multiplier2*A_idlower[i][k]
                        invert[j][k] = invert[j][k] - multiplier2*invert[i][k]
        return invert



    print(inverse(A))

问题出在这里:

A_id = A[:]       #appling operations on a copy of matrix A

这会执行 A 浅拷贝 。换句话说,它创建了一个新列表,其中引用了原始列表中的每一行。但是这些行本身并没有被复制。

要解决此问题,您需要创建原始矩阵的深层副本。一种方法是使用列表理解:

A_id = [row[:] for row in A]

这将适用于此处问题的特定情况,但仍然不是深度复制任何任意嵌套列表的通用解决方案。