通常,列表推导用于从现有列表中派生新列表。例如:
>>> 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)
答案 0 :(得分:10)
你确实应该避免使用列表推导(以及字典理解,设置理解和生成器表达式)来产生副作用。除了他们积累虚假名单并因此浪费记忆这一事实之外,它也令人困惑。我期望列表理解能够生成(有意义的)值,许多人会同意。另一方面,循环显然是一系列陈述。预计它们会产生副作用并且不会产生任何结果值 - 毫不奇怪。
答案 1 :(得分:4)
来自python文档:
List comprehensions provide a concise way to create lists. Common applications are to make new lists
答案 2 :(得分:2)
在你给出的例子中,最有意义的是:
b = [i for i in a]
如果由于某种原因你想创建b。一般来说,必须采用一些常识。如果使用理解使您的代码不可读,请不要使用它。否则就去吧。
答案 3 :(得分:2)
如果您打算使用创建的列表,则仅使用列表推导。否则,您只需为GC创建它而不再使用它。
因此,您应使用正确的for循环代替[b.append(i) for i in a]
:
for i in a:
b.append(i)
另一个解决方案是通过生成器表达式:
b += (i for i in a)
但是,如果要附加整个列表,只需执行
即可b += a
如果您只需要在将元素添加到列表之前将元素应用于元素,则可以始终使用map
:
b += map(somefunc, a)
答案 4 :(得分:0)
b = []
a = [1, 2, 3, 4, 5]
b.extend (a)