Python求矩阵行列式时pop()同时修改两个列表如何解决?
矩阵行列式计算代码问题修复
问题核心原因
你用到的m[:][:]属于浅拷贝,仅复制了二维列表的外层结构,内层存储每行数据的子列表仍然和原矩阵m共享引用,所以修改y[j]子列表的元素时,会同步修改原矩阵m的对应数据。
除此之外你的代码还存在几个影响运行的隐性问题:
- 可变默认参数
y=[]会在多次调用函数时残留之前的计算数据,引发未知错误 - 没有递归终止条件,当矩阵缩小到1x1大小时会直接报错
- 幂运算优先级错误:
-1**(1+i)会优先计算1**(1+i)再添加负号,最终结果永远为-1,不符合余子式的符号规则 - 内层删除列的
y[j].pop(i)没有正确缩进,不属于for j循环的执行体
修复方案
- 把浅拷贝替换为逐行深拷贝,保证修改子列表不影响原矩阵
- 补充递归终止条件:1x1矩阵直接返回唯一元素
- 修正符号计算的括号,保证负号参与幂运算
- 删除无用的可变默认参数,修正缩进错误
修复后可运行代码
def deff(m): # 递归终止条件:1x1矩阵直接返回元素值 if len(m) == 1: return m[0][0] x = 0 for i in range(len(m)): # 逐行拷贝实现二维列表深拷贝 y = [row[:] for row in m] k = y[0][i] # 删除第一行 y.pop(0) # 删除对应列 for j in range(len(y)): y[j].pop(i) # 修正符号计算的括号 x += k * deff(y) * ((-1) ** (1 + i)) return x
测试示例
你可以用二阶矩阵验证计算结果:
# 二阶矩阵[[1,2],[3,4]]的行列式应为 1*4 - 2*3 = -2 print(deff([[1,2],[3,4]])) # 输出-2,计算正确
内容的提问来源于stack exchange,提问作者ONIMEXA
相关产品推荐
相关产品推荐

