我最近发现枚举可以更轻松地识别索引和值。但是,我注意到一个奇怪的用法。如果您声明一个枚举对象并以任何方式使用它,则对象内部的数据将随后消失。
这是怎么回事?
在一个简单的示例中,您声明一个带有枚举列表的对象。您一次将其转换回列表。第二次尝试时,它为空。
A = [1, 2, 3, 4]
enuObject = enumerate(A)
>>> list(enuObject)
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>> list(enuObject)
[]
当我在循环内或循环外声明枚举调用时,我注意到了这一点。
答案 0 :(得分:0)
enumerate
对象是一个迭代器,当垃圾收集器发现它不再使用时将被释放。但是,在此示例中,enumerate
函数完全使用了list
的迭代器。这样做非常类似于:
items = []
for e in en:
items.append(e)
return items
它从枚举对象en
中获取每个元素,将它们添加到列表中,然后在没有剩余任何项时返回列表。因此,如果您再次在完全消耗的枚举对象上调用list
,则for e in en
将没有任何项目要添加到列表中,因此它只会返回一个空列表。>
答案 1 :(得分:0)
迭代器
代表数据流的对象。重复调用迭代器的next()方法将返回流中的后续项。如果没有更多数据可用,则会引发StopIteration异常。此时,迭代器对象已用尽,对它的next()方法的任何进一步调用只会再次引发StopIteration。迭代器必须具有返回迭代器对象本身的__iter__()
方法,因此每个迭代器也是可迭代的,并且可以在接受其他可迭代的大多数地方使用。一个值得注意的例外是尝试多次迭代遍历的代码。每当您将容器对象(例如列表)传递给iter()函数或在for循环中使用它时,都会产生一个新的新迭代器。使用迭代器尝试执行此操作只会返回上一次迭代过程中使用的相同的耗尽迭代器对象,使其看起来像一个空容器。
这在Python文档中。所以基本上它是有意设计的。
简而言之,当您到达迭代器的末尾时,将引发StopIteration
。