2012-01-01 36 views
10

通常,列表解析用於從現有列表中派生新列表。例如:正確使用列表解析 - python

>>> a = [1, 2, 3, 4, 5] 
>>> [i for i in a if i > 2] 
[3, 4, 5] 

我們應該使用它們來執行其他過程嗎?例如:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [] 
>>> [b.append(i) for i in a] 
[None, None, None, None, None] 
>>> print b 
[1, 2, 3, 4, 5] 

,或者我應該避免以上,並使用以下代替?:

for i in a: 
    b.append(i) 

回答

10

你確實應該避免使用列表理解(有字典推導一起,設定內涵和發生器表達式)的副作用。除了它們會累積虛假列表並因此浪費記憶之外,這也是令人困惑的。我期望列表理解能夠產生一個(有意義的)價值,並且很多人會同意。另一方面,循環顯然是一系列的陳述。預計它們會引發副作用並且不會產生任何結果 - 毫不奇怪。

2

在你給它將使最有意義做例子:

b = [i for i in a] 

如果由於某種原因你想創建b。一般來說,必須採用一些常識。如果使用理解會使您的代碼無法讀取,請勿使用它。否則就去吧。

+1

'b = a [:]'也會起作用... – 2012-01-01 21:19:48

2

如果您計劃使用創建的列表,請僅使用列表解析。否則,你只是爲了讓GC再次拋出而不用它而創建它。

所以不是[b.append(i) for i in a]你應該使用正確的for循環:

for i in a: 
    b.append(i) 

另一個解決方案是通過生成器表達式:

b += (i for i in a) 

但是,如果要追加整個列表,你可以簡單地做

b += a 

如果您只是需要將其添加到列表之前申請的元素的功能,你可以隨時使用map

b += map(somefunc, a) 
+0

我相信你對這個(確實相當糟糕的)例子太過關注。 – delnan 2012-01-01 21:07:42

+0

那麼最主要的問題是在一開始就回答 - 關於這個例子的內容只是爲了給用戶一些關於替代方案的想法。 – ThiefMaster 2012-01-01 21:15:54

0
b = [] 
a = [1, 2, 3, 4, 5] 
b.extend (a)