外部对象在功能内被更改

时间:2014-02-20 15:48:12

标签: python loops matrix

所以我试图制作一个有趣的决定性函数,但我遇到了代码特定部分的问题。它发生在创建子矩阵期间。我的意思是,通过从旧的矩阵中删除一列和一行来创建一个新的矩阵 即 来自:

a = [[1,2,3],[4,5,6],[7,8,9]]

到suba矩阵,表示删除了col1和row1:

suba = [[5,6],[8,9]]

我要做的是使用for循环打印出相同原始矩阵的3个子矩阵,但每次运行该函数时,它都会用子矩阵替换原始矩阵。

我的代码是:

a = [[1,2,3],[4,5,6],[7,8,9]]


def submatrix(mat,row,col):
    '''
    Creates the smaller matrix by removing column and row of element.
    e.g. to remove the 1st column and row from matrix: M = [[1,2,3],[4,5,6],[7,8,9]]
    type: submatrix[M,1,1]
    '''
    temp = mat
    if len(mat) == 2:
        return mat
    elif len(mat) == 1:
        return mat
    else:
        for i in range(len(mat)):
            del temp[i][col-1]
        del temp[row-1]
        return temp


for e in range(len(a)):
    print submatrix(a,1,e+1)

我想要它做的是打印出类似的东西:

[[5, 6], [8, 9]]
[[4, 6], [7, 9]]
[[4, 5], [7, 8]]

但打印出来的是:

[[5, 6], [8, 9]]
[[5, 6], [8, 9]]
[[5, 6], [8, 9]]

如果我要说,打印一个,现在就是这个子矩阵。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用copy模块,在代码的第一行导入:

import copy

然后在submatrix函数中,更改此行:

temp = mat

temp =  copy.deepcopy(mat)

答案 1 :(得分:0)

问题在于temp = mattemp指向与mat完全相同的对象,因此当您通过删除行和列修改temp时,您也是修改函数内部和外部的原始mat矩阵。

要防止出现这种情况,您需要使用copy.deepcopy或(专门用于复制列表列表)通过temp = map(list, mat)创建矩阵的深层副本。这将使temp成为矩阵(也称为列表列表),并保留从原始矩阵中的行创建的列表。