Python 复制矩阵

Python copy matrix

所以我有一个快速的问题,我的代码应该删除它所做的行和列(从 i 和 j),但由于某种原因它也改变了原始矩阵(当我复制它时)。谁能告诉我这是为什么?

def reduce_matrix(M, i, j):
    newM=list(M[:])
    for q in range(len(newM)+1):
        if q==i-1:
            del newM[q]
    for y in range(len(newM)):
        for x in range(len(newM[y])):
            if x==j-1:
                del newM[y][x]
    return newM

您必须复制列表中的所有子列表,而不是复制所有列表。

试试这个:

def reduce_matrix(M, i, j):
    newM=[k[:] for k in M]
    #rest of code

来自您的程序:。尝试打印每个子列表的 id

def reduce_matrix(M, i, j):
    newM=list(M[:])
    print id(M[0]), id(M[1]), id(M[2])
    for q in range(len(newM)+1):
        if q==i-1:
            del newM[q]
    for y in range(len(newM)):
        for x in range(len(newM[y])):
            if x==j-1:
                del newM[y][x]
    return newM

lis = [[1,2,3],[3,4,5],[7,4,2]]
print id(lis[0]), id(lis[1]), id(lis[2])
reduce_matrix(lis, 1, 1)

>>>
3074546604 3072046316 3072047084
3074546604 3072046316 3072047084

这证明,子列表只是tagging or pointing到另一个variable.So修改任何子列表将发生在每个子列表具有相同tags

例如:

a = [1,2]
b = a
c = a
b.append(3)
print a
print b
print c
>>>
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]

希望对您有所帮助。

您只复制第一个列表,不复制子列表。 如果你想return一个减少行和列的新矩阵,你可以这样做:

def reduce_matrix(M, i, j):
    return [[M[m][n] for n in range(len(M[m])) if j-1 != n ] \
               for m in range(len(M)) if i-1 != m]