我想要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]]
我不知道我在做什么错。我需要了解并发现我的错误。谢谢。
答案 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