试图学习一些矩阵运算,但是我有一个错误

时间:2018-07-20 17:36:19

标签: python

我想要python中的程序

m = [[1,0,0],
     [0,1,0],
     [0,0,1]]

n = [[1,2,3],
     [2,3,4],
     [2,4,1]]

def cofactor(s,j):
    p = m.copy()
    for i in range(0,len(p)):
        p[i].pop(s)
    p.pop(j)
    return p
cofact = cofactor(2,1)
print(cofact)
print(m)

把这个还给我

[[1, 0], [0, 0]]
[[1,0,0],[0,1,0],[0,0,1]]

但是却给出

  [[1, 0], [0, 0]]
[[1, 0], [0, 1], [0, 0]]

我不知道我在做什么错。我需要了解并发现我的错误。谢谢。

1 个答案:

答案 0 :(得分:0)

根据Python文档,3. Data models >>> 3.1. Objects, values and types

  

某些对象包含对其他对象的引用;这些称为容器。容器的示例是元组,列表和字典。引用是容器值的一部分。在大多数情况下,当我们谈论容器的值时,我们暗含的是值,而不是所包含对象的标识。但是,当我们谈论容器的可变性时,仅隐含了直接包含的对象的身份。因此,如果不可变容器(如元组)包含对可变对象的引用,则当该可变对象更改时,其值也会更改。

m和p的

元素(列表及其各自的元素)指的是相同的对象。如果更改了这些对象,它将在两个容器对象中均得到反映。可以很容易地验证。

在m赋值后添加:

print(id(m[0]), id(m[0][0])) 

在函数体内分配p之后:

print(id(p[0]), id(m[0][0]))

您将看到这些对象的身份相同。

您还应该查看The Python Standard Library >>> 8. Data types >>> 8.10. copy - Shallow and deep copy operations

中的说明
  

Python中的Assignment语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此一个副本可以更改一个副本而不更改另一个副本。此模块提供通用的浅层和深层复制操作(如下所述)。

为了避免将来出现此类问题,我建议您查看StackOverflow贡献者Ned Batchelder关于名称和值的很好的解释:Python Names and Values