list comprehensions put non-names into namespaces!

Ben Cartwright bencvt at gmail.com
Thu May 25 20:12:28 EDT 2006


skip at pobox.com wrote:
> Lonnie> List comprehensions appear to store their temporary result in a
>     Lonnie> variable named "_[1]" (or presumably "_[2]", "_[3]" etc for
>     Lonnie> nested comprehensions)
>
> Known issue.  Fixed in generator comprehensions.  Dunno about plans to fix
> it in list comprehensions.  I believe at some point in the future they may
> just go away or become syntactic sugar for a gen comp wrapped in a list()
> call.

The latter, starting in Python 3.0.  It won't be fixed before Python
3.0 because it has the potential to break existing 2.x code.  From PEP
289:

"""List comprehensions also "leak" their loop variable into the
surrounding scope. This will also change in Python 3.0, so that the
semantic definition of a list comprehension in Python 3.0 will be
equivalent to list(<generator expression>). Python 2.4 and beyond
should issue a deprecation warning if a list comprehension's loop
variable has the same name as a variable used in the immediately
surrounding scope."""

Source: http://www.python.org/dev/peps/pep-0289/

Also mentioned in PEP 3100.

Doesn't look like the deprecation warning was ever implemented for 2.4,
though.  On my 2.4.3:

  >>> def f():
      [x for x in range(10)]
      print x
  >>> f()
  9
  >>> # no warning yet..

2.5 is in alpha now, hopefully the warning will be added.

--Ben




More information about the Python-list mailing list