[Python-Dev] Seeming unintended difference between list comprehensions and generator expressions...

Carl Johnson cmjohnson.mailinglist at gmail.com
Sun Feb 22 09:17:02 CET 2009


Nick Coghlan wrote:
>
> Josiah Carlson wrote:
> >> Similarly, a 3.x list comprehension [i*i for i in x] is very roughly
> >> translated as:
> >>
> >>  def _lc(arg):
> >>    result = []
> >>    for i in arg:
> >>      result.append(i*i)
> >>    return result
> >>
> >>  <expr_value> = _lc(x)
> >
> > I was under the impression that in 3.x, it was equivalent to
> > list(<genexp>) .  Which would explain the difference between 2.6 and
> > 3.0.
>
> Semantically, the two translations end up being the same.

Actually, they're not quite the same. list(<genexp>) will swallow any
StopIteration exceptions that end up getting thrown inside the
generator, but even in Python 3, list comprehensions will not catch
StopIteration. So for explanatory purposes, thinking of a list
comprehension as a function that returns a list is more useful than
thinking of it as list(<genexp>).

-- Carl


More information about the Python-Dev mailing list