python - 为什么在递归过程中变量会发生变化(试图计算矩阵行列式)
问题描述
我正在尝试使用简单的递归来计算矩阵的行列式(行主顺序),但由于某种原因,变量matrix
在最后一个循环期间发生了变化,我不明白为什么,因为我没有编写任何改变的代码变量的值。
import math
def print_m(matrix): # Print the matrix
for i in range(len(matrix)):
print(matrix[i])
def determinant(matrix):# return determinant assuming scanning through first row
if len(matrix[0]) != len(matrix):
print('Not square matrix')
return None
if len(matrix) == 2:
print('LAST STEP EXECUTED')
return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
def get_reduced_matrix(matrix, column): #not responsible for changin sign
newM = matrix[1:]
for i in range(len(matrix) - 1):
del newM[i][column]
return newM
output = 0
for i in range(len(matrix)): #value of matrix changed when i turned into 1
print("i =", i)
print_m(matrix)
print('END')
output += matrix[0][i] * determinant(get_reduced_matrix(matrix, i)) * math.pow(-1, i + 1) # change in sign at last
print('Gonna do the loop again')
return output
matrix1 = [
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]
]
print(determinant(matrix1))
输出:
C:\Users\jason\Desktop\Python\venv\Scripts\python.exe C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py
i = 0
Traceback (most recent call last):
File "C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py", line 38, in <module>
[11, 12, 13]
print(determinant(matrix1))
[21, 22, 23]
[31, 32, 33]
File "C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py", line 26, in determinant
end
output += matrix[0][i] * determinant(get_reduced_matrix(matrix, i)) * math.pow(-1, i + 1) # change in sign at last
LAST STEP EXECUTED
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType' #MATRIX LOST SOME OF ITS VALUE HERE
gonna do the loop again
i = 1
[11, 12, 13]
[22, 23]
[32, 33]
end
Not square matrix
Process finished with exit code 1
所以矩阵刚刚在第二行和第三行丢失了它的第一列条目,我根本不知道发生了什么。就像我说的,我一开始没有写任何可以改变matrix
值的代码。
解决方案
它发生变化的原因是因为矩阵包含对组成行的数组的引用。
如果你有一个矩阵:
matrix1 = [
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]
]
然后你分一杯羹:
newM = matrix[1:]
newM
是一个新矩阵,但它包含对与原始矩阵相同的行数组的引用:
>> newM = matrix[1:]
>> newM[0] is matrix[1] # is it the same reference
True
如果要在不更改原始数据的情况下操作它们,则需要对行进行更深的复制。也许是这样的:
newM = [m[:] for m in matrix[1:]]
会在这种情况下工作吗?
推荐阅读
- mongodb - 我想根据发生时间查询集合中定义的持续时间之间的持续会议
- sql - 比较列但排除特定对
- ios - SwiftUI 删除 ForEach 子视图中的数组条目
- image - 渲染图像时管理 GC 压力的有效方法
- python - 将 QListWidgetItem 拖出 QListWidget
- typescript - 具有条件类型的数组中的打字稿泛型
- python - 在 groupby 表上应用一个函数,该函数依赖于另一列的值并完整地返回所有其他列
- node.js - 在调用 webpack CLI 时,有没有办法知道构建是成功还是失败?
- asynchronous - 如何从 Python 中的一个云函数调用另一个云函数?(异步 - 我不需要回复。)
- r - 根据 geom_tile() 热图中的两列值对行重新排序