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]
所以我有一个快速的问题,我的代码应该删除它所做的行和列(从 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]