繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM