Dangerous behavior of list(generator)

Ned Deily nad at acm.org
Sat Dec 12 21:43:20 EST 2009


In article <nad-8CDB63.18012412122009 at news.gmane.org>,
 Ned Deily <nad at acm.org> wrote:

> In article 
> <ec96e1390912121653w56c3dbe3p859a7b979026bf47 at mail.gmail.com>,
>  Benjamin Kaplan <benjamin.kaplan at case.edu> wrote:
> > On Sat, Dec 12, 2009 at 7:15 PM, Tom Machinski <tom.machinski at gmail.com> 
> > wrote:
> > > In most cases, `list(generator)` works as expected. Thus,
> > > `list(<generator expression>)` is generally equivalent to `[<generator
> > > expression>]`.
> > Actually, it's list(generator) vs. a list comprehension. I agree that
> > it can be confusing, but Python considers them to be two different
> > constructs.
> > 
> > >>> list(xrange(10))
> > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
> > >>> [xrange(10)]
> > [xrange(10)]
> 
> That's not a list comprehension, that's a list with one element.
> 
> >>> [x for x in xrange(10)]
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
> 
> <CrocodileDundee> Now *that's* a list comprehension. </CrocodileDundee>

Which is not quite the point Benjamin was trying to make - sorry!

Consulting the adjacent sections on "List displays" and "Generator 
expressions" in the Language Reference:

http://docs.python.org/reference/expressions.html#list-displays

for generator expressions "the parentheses can be omitted on calls with 
only one argument " but the expressions in a list_comprehension are not 
in a call context.  So there is no ambiguity: [<generator expression>] 
requires parens around the generator expression and that list display 
produces a list with one element as Benjamin points out.

-- 
 Ned Deily,
 nad at acm.org




More information about the Python-list mailing list