我们知道将一个list传入函数后,若函数内部对实参修改,形参也会随之改变.因为list是可变对象,numpy的array也是可变对象.
但是这段代码中,我使用了乘法构造了matrix2,并转换为nparray.
网上说:
*操作符对于不可变对象很安全,但对于可变对象,可能就不是你期望的结果了。因为不可变对象是复制值,而可变对象是复制引用。
这里的matrix2_np是由matrix2转换过来的,按理说也是第二列复制的第一列的引用,但是它的值为什么没有改变?
请教各位大佬,谢谢。
import numpy as np
# 列表定义的两行三列的0矩阵
row = 2
col = 3
matrix1 = [[0 for i in range(col)] for j in range(row)]
matrix2 = [[0] * col] * row
def print_matrix(mat):
for row in range(len(mat)):
for col in range(len(mat[0])):
print(mat[row][col], end=" ")
if col == len(mat[0]) - 1:
print("")
print("")
print_matrix(matrix1)
print_matrix(matrix2)
matrix1[0][0] = 1
print_matrix(matrix1)
matrix2[0][0] = 1
# 可以看到第0列都变成1了,猜想是因为 *
print_matrix(matrix2)
# 改回原来的数组
matrix2[0][0] = 0
matrix2_np = np.array(matrix2)
print_matrix(matrix2_np)
# 这里只有第0行第0列变成0了,为什么*失效了?
# 见输出的最后一行
matrix2_np[0][0] = 1
print_matrix(matrix2_np)
输出如下:
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
0 0 0
1 0 0
1 0 0
0 0 0
0 0 0
1 0 0
0 0 0