为什么我为(看似)相同的代码获得不同的输出?

时间:2016-03-30 05:41:15

标签: python list for-loop

我试图理解为什么这两个例子给了我不同的输出。

例1:

list1 = [1,2,3,4,5]
list2 = []
for l in list1:
    list2.append(l)
print list2

#[1, 2, 3, 4, 5]

例2:

list1 = [1,2,3,4,5]
list2 = []
list2.append(l for l in list1)
print list2

#[<generator object <genexpr> at 0x10379ecd0>]

我已尝试在第二个示例中的追加后添加list()或tuple(),但它在新列表中给出了一个单独的元素,而不是5个不同的元素。

list2.append(tuple(l for l in list1))

#[(1, 2, 3, 4, 5)]

对于for循环,只有一行使用Example1可以获得相同的输出吗?

我真的很感激任何帮助!

4 个答案:

答案 0 :(得分:4)

第二个例子

需要extend而不是append
list1 = [1,2,3,4,5]
list2 = []
list2.extend(l for l in list1)  # or just list2.extend(list1)
print list2

如果您只想复制list1,那么

list2 = list1[:]

list2 = list(list1)

会这样做

答案 1 :(得分:3)

(l for l in list1)generator expression。它显式返回一个生成器,它本质上是一个节省内存的迭代器(想一个列表,但是每个元素都是动态返回的,而不是全部存储在内存中)。实现它的关键是生成器表达式,注意表达式被()所包围。

list2.append(l for l in list1)中,您已将单个生成器附加到空列表中。您仍然可以通过for element in list2[0]获得所需的所有元素,但这不是一回事。

然而,在做

for l in list1:
   list2.append(l)

没有遇到这样的生成器表达式。在每次迭代中 - 循环的每次运行 - l,一个元素,被附加到末尾。因此,为什么这会以您的思维方式运作。

如果您希望使用与生成器表达式类似的内容list2,则需要使用list comprehension代替:

list2 = [l for l in list1]

请注意,列表推导的结构与生成器表达式之间的区别仅仅是方括号[]而不是括号。

答案 2 :(得分:0)

您不想在第二个示例中使用append。相反,你想要

list2 = [l for l in list1]

复制列表有更简单的方法,但这是与示例2中最匹配的方法。

答案 3 :(得分:0)

如果您不喜欢嵌套列表,那么您可以使用:

list1 = [1,2,3,4,5]
list2 = []
[list2.append(l) for l in list1]