初始化(2)
入门。
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 了...