[Python-ideas] PEP 572 version 2: Statement-Local Name Bindings

Chris Angelico rosuav at gmail.com
Sat Mar 24 05:18:57 EDT 2018


On Sat, Mar 24, 2018 at 8:07 PM, Christoph Groth
<christoph at grothesque.org> wrote:
> Chris Angelico wrote:
>
>> Thank you; both of these have now been incorporated into the document.
>
> Thanks!  Just a small comment.  You wrote in the PEP draft:
>
>> # Name bindings inside list comprehensions usually won't leak
>> ...
>> # But occasionally they will!
>
> I don't understand what you mean here.  If the (y as x) syntax is to
> have, as you say, "the exact same semantics as regular assignment", then
> assignments inside list comprehensions would always "leak".  But this is
> a good thing, because this is consistent with how Python behaves.

Except that a list comprehension is implemented using an inner
function. Very approximately:

x = [n * m for n in range(4) for m in range(5)]

def <listcomp>(iter):
    ret = []
    for n in iter:
        for m in range(5):
            ret.append(n * m)
    return ret
x = <listcomp>(iter(range(4))

So the first (outermost) iterable is actually evaluated in the
caller's scope, but everything else is inside a subscope. Thus an
assignment inside that first iterable WILL leak into the surrounding
scope; but anywhere else, it won't.

ChrisA


More information about the Python-ideas mailing list