python初始化指定長度的二維list
阿新 • • 發佈:2018-11-26
在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次。如果採用方式一,則對lists()進行淺拷貝,每一個list()呼叫append等方法時,所有list()都會同步呼叫;而方式二這種python風格的陣列comprehension表示式方式,則可以實現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], [], [], [], []]