1. 现象
首先是一维数组的情况:
arr1 = [0]*3
arr[2]=3
print(arr1)
结果如下,可以看到,在一维数组的情况下是没有问题的,结果符合预期。
而在多维数组的情况下所示,先创建一个多维数组(这里以二维数组为例),代码如下:
arr2=[[1]*2]*3
arr2[0][0]=3
print(arr2)
结果如下:
可以看到,结果明显与预期不符,代码操作的意图是将第0行第0列的元素值改为3,而结果却是将第0列的所有元素值都改为了3。
2. 原因
出现这种情况的原因是由python的浅拷贝引起的,也就是说,除了第一行之外,剩下的两行都是浅拷贝的第一行,造成的结果就是这三行中每列指向的地址是相同的,当改变某行某列的值时,自然就改变了同一列上的其他值。
3. 解决方法
使用列表推导式的方法避免其进行浅拷贝即可,具体如下:
arr2=[[1]*2 for i in range(3)]
arr2[0][0]=3
print(arr2)
运行结果:
可以看到,结果已经符合预期了,这里主要是避免了对[1]*2
的copy操作。