前言
今天生成二维数组的时候发现的这一问题,主要还是可变对象和不可变对象的差别
1 当生成一个一维数组时:
array1 = [0]*5
array2 = [0 for i in range(5)]
print('1', array1, '\n', '2', array2)
1 [0, 0, 0, 0, 0]
2 [0, 0, 0, 0, 0]
进行某一位的修改
array1[2] = 8
array2[2] = 8
print('1', array1, '\n', '2', array2)
1 [0, 0, 8, 0, 0]
2 [0, 0, 8, 0, 0]
可以看到这两种方式生成修改基本是一致的。
2 当生成一个二维数组时,直接上代码
row = 4
col = 4
array1 = [[0 for i in range(col)] for j in range(row)]
array2 = [[0]*col] * row
print('1', array1, '\n', '2', array2)
array1[2][2] = 8
array2[2][2] = 8
print('1', array1, '\n', '2', array2)
1 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
2 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
1 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 8, 0], [0, 0, 0, 0]]
2 [[0, 0, 8, 0], [0, 0, 8, 0], [0, 0, 8, 0], [0, 0, 8, 0]]
可以看到当我们对一个一维列表用乘法生成二维列表时,改动一个位置,每一行的第三列位置都发生了变化,而用列表生成式的话,是符合我们的要求的,仅改动了第三行第三列的数。
分析:
一维数组用乘法直接生成二维数组,其对象是列表,为可变对象,生成的二维数组每一行均指向同一对象,所以改动一个,均会发生改变,这个原理和python copy,deepcopy机理类似。而生成一维数组时,数字是不可变对象,所以某位置修改不会影响其他位置的值。
参考: link.