初始化(2)

Updated: 2018-12-29

入门

Python的数组初始化不要太简单:

>>> [0] * 3
[0, 0, 0]

这样就有了一个全0的数组。修改任意一个元素试试:

>>> a = [0] * 3
>>> a[1] = 99
>>> a
[0, 99, 0]

坑!

一维数组搞定了,二维数组还远么?

>>> a = [[0] * 3] * 4
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

嗯,在一次面试的时候我就是这么干的,之后全部的时间都被用来debug,直到全无头绪,“抱着试试看的心理”敲了下面这个命令:

>>> a[1][1] = 1
>>> a
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]

牵一发而动全身...

进阶

显然内层的[0] * 3是没有问题的,生成了一个长度为3的一维数组;问题出在后面的* 4, 它并没有生成四个独立的一维数组,而是把同一个数组重复了四次,打断了骨头还连着筋,所以改变任何一行其他行也都跟着改变。

正确的方法是这样的:

>>> a = [[0 for _ in range(3)] for _ in range(4)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[1][1] = 1
>>> a
[[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0]]
>>>

或者简单一点:

>>> a = [[0] * 3 for _ in range(4)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[1][1] = 1
>>> a
[[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0]]

还有,那次面试我fail了...