最近在复习数据结构,第一条就是数组,记录下Python中多维数组的采坑总结
构建一个缺省值为0,宽为m,高为n的多维数组
m, n = 4, 3
newList = [[0] * m] * n
print(newList)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
尝试改变数组某个元素:
newList[1][0] = 1
print(newList)
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
发现不是期望的结果,正常应该是:
[[0, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0]]
而导致这种结果的原因是我们在定义 [ [0] * m] * n的时候,使用的是Python浅拷贝。也就是说,只是对[0] * m这个数组创建了n个引用,所以当原数组的元素改变后,导致整个多维数组都发生改变。
那如果用深拷贝方法创建多维数组呢?
newList = [[0] * m for i in range n]
print(newList)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
这时再次尝试修改数组元素:
newList[1][0] = 1
print(newList)
[[0, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0]]
结果正确。说明在使用深拷贝创建数组的过程中,创建了n个 [0] * m的数组,而不是简单的引用。