为什么Python列表的不同初始化会为矩阵乘法提供不同的输出
我尝试进行矩阵乘法,同时使用快捷方式C[[0]*列]*行初始化列表。 列表是按我的要求初始化的,但它给了我错误的答案。 在我尝试用for循环初始化代码之后,它给出了正确的答案。 请帮助我理解python列表行为背后的原因 这是我的代码:为什么Python列表的不同初始化会为矩阵乘法提供不同的输出,python,list,matrix,matrix-multiplication,Python,List,Matrix,Matrix Multiplication,我尝试进行矩阵乘法,同时使用快捷方式C[[0]*列]*行初始化列表。 列表是按我的要求初始化的,但它给了我错误的答案。 在我尝试用for循环初始化代码之后,它给出了正确的答案。 请帮助我理解python列表行为背后的原因 这是我的代码: A = [[1,2],[3,4]] B = [[5,6,],[7,8]] C = [] for i in range(2): c = [] for j
A = [[1,2],[3,4]]
B = [[5,6,],[7,8]]
C = []
for i in range(2):
c = []
for j in range(2):
c.append(int(0))
C.append(c)
D = [[int(0)]*2]*2
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
C[i][j] += A[i][k] * B[k][j]
D[i][j] += A[i][k] * B[k][j]
for r in C:
print(r)
print(D)
这是我的输出:
[[19, 22],[43, 50]]
[[62, 72], [62, 72]]
原因可能是,在执行列表相乘的“快捷方式方法”时,Python不会对列表进行深度复制。请参见此示例:
d=[5*[2]]*3
>> [[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]]
d[0][0]=1
>> [[1, 2, 2, 2, 2], [1, 2, 2, 2, 2], [1, 2, 2, 2, 2]]
看起来我正要修改元素[0][0],但实际上其他行只是引用第一行-因此我更改了三行而不是一行
请考虑使用矩阵运算:<< /P>子代码列表>代码> d>代码>指向内存中相同的列表。见(谢谢)需要在不使用Numpy的情况下处理此问题。