Search code examples
pythoniteratorgeneratorenumerate

Is enumerate in python lazy?


I'd like to know what happens when I pass the result of a generator function to python's enumerate(). Example:

def veryBigHello():
    i = 0
    while i < 10000000:
        i += 1
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word
    

Is the enumeration iterated lazily, or does it slurp everything into the <enumerate object> first? I'm 99.999% sure it's lazy, so can I treat it exactly the same as the generator function, or do I need to watch out for anything?


Solution

  • It's lazy. It's fairly easy to prove that's the case:

    >>> def abc():
    ...     letters = ['a','b','c']
    ...     for letter in letters:
    ...         print letter
    ...         yield letter
    ...
    >>> numbered = enumerate(abc())
    >>> for i, word in numbered:
    ...     print i, word
    ...
    a
    0 a
    b
    1 b
    c
    2 c