枚举的实现细节是什么?

时间:2013-05-29 07:57:20

标签: python loops heap allocation enumerate

Python有enumerate()迭代带有索引的对象。我怀疑解释器创建了很多int对象,其唯一目的是跟踪事物的位置。 PEP page 说了以下内容,但我真的不明白幕后发生了什么:

  

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

那么这里的魔力是什么?

2 个答案:

答案 0 :(得分:11)

enumerate()是一个迭代器;它只能动态生成索引int ;它不能预先产生它们。

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

def enumerate(iterable, start=0):
    count = start
    for elem in iterable:
        yield count, elem
        count += 1

yield关键字使其为generator function,您需要循环生成器(或在其上调用next())以推进函数生成数据,{{1}一次调用。

Python也实习yield个值,-5到256(含)之间的所有值都是单例,所以上面的代码甚至不会生成新的int个对象,直到达到257。

答案 1 :(得分:2)

它可以帮助你了解事物的所在......

l = ['apple', 'banana', 'cabbage']

for idx, item in enumerate(l):
    print "the item: %s, is at position %s" % (item, idx)

>>> 
the item: apple, is at position 0
the item: banana, is at position 1
the item: cabbage, is at position 2

这有助于以下场景..想象一下,您想要找到列表中的每个“卷心菜”项目。并了解他们的指数。

l = ['apple', 'banana', 'cabbage', 'monkey', 'kangaroo', 'cabbage']

def find_indexes(lst, match):
    results = []
    for idx, item in enumerate(l):
        if item == match:
            results.append(idx)
    return results

print find_indexes(l, 'cabbage')

>>> 
[2, 5]