List comprehensions' ugliness (Was: Re: How to explain exactly what "def" does?)

Alex Martelli aleax at aleax.it
Wed Feb 5 19:25:41 EST 2003


Hans Nowak wrote:
   ...
>    [mylist.append(z) for z in otherlist]
> 
> The point of list comprehensions is to return a list, and the example
> above
> doesn't do anything with that list.  It's better written as
> 
>    for z in otherlist:
>        mylist.append(z)

mylist.extend(otherlist) is better.


> I'm sure there are better (worse?) examples of list comp abuse.

Sure, such as faking assign-and-test:

while [x for x in [<expression>] if x]:
    process(x)

since you cannot do:

while x=<expression>:
    process(x)

I think this is the iffiest/ugliest of the possibly-handy uses of LCs --
it's not very clear AND relies on the sad fact that the bindings in
a LCs' for clauses "leak" to the surrounding scope (a LC doesn't
have its own scope "nested" in the surrounding one).


Alex





More information about the Python-list mailing list