Python复制矩阵

Python复制矩阵,python,matrix,copy,Python,Matrix,Copy,因此,我有一个快速的问题,我的代码应该删除行和列(从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(

因此,我有一个快速的问题,我的代码应该删除行和列(从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
这证明,子列表只是
标记或指向另一个变量。因此,对任何子列表的修改都会发生在具有相同
标记的每个子列表上

例如:

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]

希望这有帮助。

您只复制第一个列表,而不是子列表。 如果要返回带有reduce row和column的新矩阵,可以执行以下操作:

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]

因为你说的是矩阵,我假设列表中有列表,看看你的代码,那些列表没有被复制。哦,拍下你的右图,你刚刚意识到子列表没有被复制,谢谢!