Different behaviour in list comps and generator expressions

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Nov 7 20:50:53 EST 2014


The following list comprehension and generator expression are almost, but
not quite, the same:

[expr for x in iterable]

list(expr for x in iterable)


The difference is in the handling of StopIteration raised inside the expr.
Generator expressions consume them and halt, while comprehensions allow
them to leak out. A simple example:

iterable = [iter([])]
list(next(x) for x in iterable)
=> returns []

But:

[next(x) for x in iterable]
=> raises StopIteration


Has anyone come across this difference in the wild? Was it a problem? Do you
rely on that difference, or is it a nuisance? Has it caused difficulty in
debugging code?

If you had to keep one behaviour, which would you keep?



-- 
Steven




More information about the Python-list mailing list