枚举的实现细节是什么?

For*_*ker 4 python heap loops allocation enumerate

Python必须enumerate()使用索引迭代对象.我怀疑解释器创建了很多int对象,其唯一目的是跟踪事物的位置.该PEP页说以下,但我真的不明白什么是引擎盖下回事:

它为所有迭代提供了iteritems()为字典提供的相同优势 - 一种紧凑,可读,可靠的索引符号.

那么这里的魔力是什么?

Mar*_*ers 11

enumerate()是一个迭代器; 它仅产生的索引int的飞行 ; 它不会预先产生它们.

您可以尝试阅读enumobject.c源代码,但它基本上可以像这样翻译成Python:

def enumerate(iterable, start=0):
    count = start
    for elem in iterable:
        yield count, elem
        count += 1
Run Code Online (Sandbox Code Playgroud)

yield关键字使这一发生器功能,你需要循环发电机(或称next()上),进入到生产数据,一个函数yield在一个时间通话.

Python也是实习int值,-5到256(含)之间的所有值都是单例,所以上面的代码甚至int在你达到257之前都不会产生新的对象.