同样是刷矩阵的转置时想定义一个空的二维数组遇到的问题。
利用乘法定义二维数组
a = [[1]*3]
b = [[1,2]*3]
c = [[1]*3]*3
d = [[1,2]*3]*3
print(a)
print(b)
print(c)
print(d)
结果
但有个缺陷,例如对d数组的元素进行改变时:
d[0][0]=0
print(d)
结果:
会发现有三处改变。这是因为构建d时对[1,2,1,2,1,2]*3是浅拷贝。浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
也就是说当后面两个[1,2,1,2,1,2] 还是对原来的引用。
print(d[0]==d[1])
print(d[1] is d[0])
结果:
d[2]同理。所以当d[0]的第1个元素改变的时候,d[1]d[2]也会随之改变。
故可以通过循环嵌套的方式定义二维数组。
e = [(i+1) for i in range(3)]
f = [[i+1 for i in range(3)] for _ in range(3)]
print(e),print(f)
f[0][0] = 0
print(f)
print(e is f[0])
print(f[0] is f[1])
结果
完美解决这个问题。nice,撒花花~