在python中,为了实现锯齿数组的数据结构,经常需要初始化一个行数指定、列数可以每行不同的list(np.array是定长的,无法实现锯齿数组变长的需求)。
我们首先来回顾一下一维list的初始化。python初始化指定长度的一维list有两种等价的方式
方式一
a = [None] * n
方法二
a = [None for i in range(n)]
结果都能得到 (n = 5)
[None, None, None, None, None]
事实上,在一维情形下,由于初始化list时被复制的元素是None,因此两种方式是等价的。
但是二维情形就不一样了,因为初始化指定长度的二维list时,我们需要把空序列list()复制n次。如果采用方式一,则对list进行浅拷贝,每一个list调用append等方法时,所有list都会同步调用;而方式二这种python风格的数组comprehension表达式方式,则生成了n个相互独立的list对象,此时每行的list之间互不影响。显然,我们应该使用方式二来进行二维list的指定行数的初始化。
测试如下:
方式一
a = [list()] * 5
a[0].append(1)
结果一
[[1], [1], [1], [1], [1]]
方式二
a = [list() for i in range(5)]
a[0].append(1)
结果二
[[1], [], [], [], []]