[英]Why am I getting different outputs for the (seemingly) same code?
我试图理解为什么这两个示例给我不同的输出。
范例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获得相同的输出?
我真的很感谢您的帮助!
对于第二个示例,您需要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)
会做的
(l for l in list1)
是一个生成器表达式 。 它显式地返回一个生成器,该生成器本质上是一个节省内存的迭代器(考虑一个列表,但是每个元素都是动态返回的,而不是全部存储在内存中)。 实现它的关键是生成器表达式,要注意该表达式被(
和)
包围。
在list2.append(l for l in list1)
你已经附加了单台发电机的空单。 您仍然可以通过for element in list2[0]
进行操作for element in list2[0]
获取所需的所有元素,但这不是一回事。
但是,在做
for l in list1:
list2.append(l)
没有遇到这样的生成器表达式。 在每次迭代-循环的每次运行-元素l
都附加到末尾。 因此,为什么这会按照您的想法起作用。
如果要使用类似于生成器表达式的方式获取list2
,则想使用列表推导:
list2 = [l for l in list1]
请注意,列表理解和生成器表达式的结构之间的区别只是方括号[
, ]
而不是括号的存在。
您不想在第二个示例中使用append。 相反,你想要
list2 = [l for l in list1]
复制列表有更简单的方法,但这是与示例2中最匹配的方法。
如果您不喜欢嵌套列表,则可以简单地使用:
list1 = [1,2,3,4,5]
list2 = []
[list2.append(l) for l in list1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.