python - 由列表推导式形成的矩阵和乘以列表元素之间的区别?

标签 python math matrix

我正在尝试将空矩阵的对角线元素更改为 1 。 所以当我通过使用列表元素相乘形成一个矩阵 [ [ 0 ] * 4 ] * 4并将其对角线元素更改为 1 ,它将所有元素更改为 1 。 但是当我使用列表推导式形成一个矩阵并将其对角线元素更改为 1 时,它工作正常。下面是上面提到的实现:


mat1 = [ [ 0 for i in range(4) ]  for j in range( 4 ) ]   #  Using List Comprehensions
mat2 = [ [ 0 ] * 4 ] * 4                                              # Using multiplying list elements


print( mat1 == mat2 )                         # True

for i in range(4):
    mat1[ i ][ i ]=1                             # mat1 =  [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]
    mat2[ i ][ i ]=1                             # mat2 =  [ [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1] ]


使用列表元素相乘形成的矩阵时我在哪里做错了? 或者我误导了一些概念?

任何解释表示赞赏!

谢谢。

最佳答案

这很有趣。

mat1 = [ [ 0 for i in range(4) ]  for j in range( 4 ) ]   #  Using List Comprehensions
mat2 = [ [ 0 ] * 4 ] * 4                                              # Using multiplying list elements


print( mat1 == mat2 )                         # True
print( mat1 is mat2 )                         # False

for i in range(4):
    mat1[ i ][ i ]=1                             # mat1 =  [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]
    mat2[ i ][ i ]=1 

从返回Falseprint(mat1 is mat2)的简单测试中我们可以看出,变量指向不同的对象。然而,print(mat1 == mat2) 返回True,如果变量引用的对象相等,就会发生这种情况。因此在这种情况下,变量是相等的。但对象不同。

正如您从 mat1 中看到的,您实际上是在嵌套循环中循环,但是对于 mat2 您实际上引用的是 [0 的相同数组]

您基本上可以通过执行以下操作来判断是否将数组相乘,

mat1 = [1,2,3]
mat2 = mat1*2
print(mat2)

# outputs
[1,2,3,1,2,3]

关于python - 由列表推导式形成的矩阵和乘以列表元素之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340251/

相关文章:

math - 有效存储质数

java - 在java中使用嵌套循环解决消除问题?

python - 将更高维度的立方体与二维数组进行卷积

c++ - 如何处理 9 维矩阵的索引

python - 滚动到网页底部

python - 在 python 中使用 scikit-learn 线性回归模型时出错

python - python 中的 Opencv 2.4.3 estimateRigidTransform

algorithm - 函数 (log n)^k 的大 O 是什么

c - 世界轴到局部轴

Python:删除不必要的括号?