如何在Python中初始化一个全0的二维数组

Python 处理二维数组还是非常方便的, 用好了事半功倍,用不好都不知道怎么进的坑。比如初始化一个3×4的全0数组, 一拍脑袋想了下面写法, 先来4个0放变量a ,再把变量a来3遍,放变量b。 打印b,很好,跟想象的一样。可是用的时候就不是那么回事了, b[0][1]赋值10,结果b[1][1],b[2][1]都变成了10。这个结果说起来简单,这可是放了很多print才发现的。回想陈儒的神书《Python源码剖析-深度探索动态语言核心技术》所说 “python一切皆对象”, 看来 b=[a]*3  中,b的每一项都是a的一个引用,所以改一个,全改。OMG!

>>> a=[0]*4
>>> b=[a]*3
>>> b
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> 
>>> b[0][1]=10
>>> b
[[0, 10, 0, 0], [0, 10, 0, 0], [0, 10, 0, 0]]

那么初始化一个二维数组,真要搞个循环嵌套 一个个append吗?

当然不是!正确的姿势是使用“列表推导”

>>> b=[[0 for i in range(4)] for j in range(3)]
>>> b
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>>
>>> b[0][1]=10
>>> b
[[0, 10, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]