我正在尝试将空矩阵的对角线元素更改为 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
从返回False
的print(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/