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]]