Python Enumerate:它是使用后发布的枚举对象吗?

问题描述 投票:1回答:2

我最近发现了枚举,以便更容易识别索引和值。但是,我注意到一个奇怪的用法。如果声明枚举对象并以任何方式使用它,则对象内的数据随后会消失。

这里发生了什么?

在一个简单示例中,您使用枚举列表声明一个对象。您将其转换回列表一次。在第二次尝试时,它是空的。

A = [1, 2, 3, 4]
enuObject = enumerate(A)
>>> list(enuObject)
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>> list(enuObject)
[]

当我在一个循环之外声明一个枚举调用时,我注意到了这一点。

python enumerate
2个回答
0
投票

enumerate对象是一个迭代器,当垃圾收集器发现它不再使用时将被释放。但是,在这个例子中,enumerate的迭代器正被list函数完全使用。这样做非常类似于:

items = []
for e in en:
    items.append(e)

return items

它从枚举对象en中获取每个元素,将它们添加到列表中,然后在没有任何项目时返回列表。因此,如果您在完全消耗的枚举对象上再次调用list,则for e in en将不会有任何要添加到列表中的项目,因此它只返回一个空列表。


0
投票

迭代器

表示数据流的对象。重复调用迭代器的next()方法返回流中的连续项。当没有更多数据可用时,会引发StopIteration异常。此时,迭代器对象已耗尽,对其next()方法的任何进一步调用只会再次引发StopIteration。迭代器需要有一个__iter__()方法,它返回迭代器对象本身,因此每个迭代器也是可迭代的,并且可以在大多数接受其他迭代的地方使用。一个值得注意的例外是尝试多次迭代传递的代码。每次将容器对象(例如列表)传递给iter()函数或在for循环中使用它时,它都会生成一个全新的迭代器。使用迭代器尝试此操作只会返回上一次迭代过程中使用的相同耗尽的迭代器对象,使其看起来像一个空容器。


这是在Python文档中。所以基本上它是故意设计的。

简而言之,当你到达迭代器的末尾时,StopIteration正在被提升。

© www.soinside.com 2019 - 2024. All rights reserved.