一个错误的定义方法
我们知道,定义一个一维数组可以轻松使用列表的乘法搞定
a = [0] * 10
那么多维数组很自然的就直接嵌套使用以上代码搞定
b = [[0] * 10] * 10
但是使用过程中,我们可以发现一个重大问题:一旦改变二维数组中任意一个一维数组,所有一位数组都会发生相同变动。
比如:
b = [[0] * 3] * 4
b[2][2] = 4
print(b)
#
'''
[[0, 0, 4], [0, 0, 4], [0, 0, 4], [0, 0, 4]]
'''
期望的结果是只有下标为[2][2]的元素变为4,但是实际上,输出如下:
[[0, 0, 4], [0, 0, 4], [0, 0, 4], [0, 0, 4]]
其实原因很简单,就是浅拷贝和深拷贝的问题,我们定义的方法是将一个一维数组的引用复制多份,整合成一个数组,本质上其实只定义一个一维数组,内存中也只有一个一维数组的空间。至于那个二维数组,实际上是由很多对于同一个一维数组的引用组合而成的数组。所以就会出现上述“牵一发而动全身”的情况啦。
一种正确的参考
下面给出一种正确的方法,肯定还有,欢迎评论区补充(如果会有人看的话)。
two_dems=[[0]*3 for _ in range(3)]
three_dems = [[[0 for _ in range(3)] for _ in range(3)] for _ in range(3)]
# test
two_dems[1][2] = 5
three_dems[1][1][2] = 6
print(two_dems)
print('-----------')
for i in three_dems:
print(i)
输出如下:
[[0, 0, 0], [0, 0, 5], [0, 0, 0]]
-----------
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 6], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
没有问题。
ps:这种方法主要用于创建二维或者三维,更高的话,代码会很繁杂。若有需求,建议用第三方库: `numpy` 创建,具体方法这里不再赘述。