<enumerate object at 0x7f0211ea2360>

5

我在Python3.5.2中运行了以下代码,并得到了相应的输出结果

>>> example = ['a','b','c','d','e']
>>> enumerate(example)
<enumerate object at 0x7f0211ea2360>

我无法理解这个输出的含义。为什么输出不像这样呢?

 (0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e') 

当我使用列表来包含这些元组时,输出结果是令人满意的。
>>> list(enumerate(example))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]

注意:我是Python的新手,当我发布这个问题时,我不知道map函数,所以我没有参考这个问题为什么在Python 3中map返回一个映射对象而不是列表?

12
因为enumerate是可迭代的,它的值是按需生成的。 - Jean-François Fabre
2
如果你按照基于Python 2的教程进行学习,那可能是你困惑的原因:这种行为是在Python 3中引入的。在这种情况下,你应该考虑切换到其他的教程。 - Jonas Schäfer
1
可能是为什么在Python 3中map返回一个映射对象而不是列表?的重复问题(这是相同的原理,答案更一般地讨论了map)。 - Chris_Rands
@JonasSchäfer 不是用于 enumerate 的,一直都是生成器。 - Jean-François Fabre
3个回答

11

这在 Python 3 中纯粹是一种设计选择,因为enumerate经常在循环/列表推导中使用,所以无需生成完整的列表并为一个很可能之后不会使用的临时对象分配内存。

大多数人使用for i,e in enumerate(example):,所以他们甚至没有注意到生成器方面,而且内存/CPU占用更低。

要获取实际的listset,必须显式强制迭代,就像你所做的那样。

(请注意,与rangezipmap不同,enumerate始终是一个生成器,即使在 Python 2.7 中也是如此。这是一个很好的选择)


1

理解enumerate

假设train_ids是我的训练对象列表。

aa=enumerate(train_ids)
type(aa)
for i in aa:
    print(i)

-3
l1 = ['a','b','c','d','e']
for i in enumerate(l1):
   print i

@BhargavRao 在做一些优化? :) - Jean-François Fabre
@Jean-FrançoisFabre,我没听懂你的意思。 - Bhargav Rao
这只是一个关于改进糟糕帖子的玩笑,不要在意。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接