On 24 March 2018 at 12:18, Chris Angelico <ros...@gmail.com> wrote:
> On Sat, Mar 24, 2018 at 11:06 PM, Paul Moore <p.f.mo...@gmail.com> wrote:
>> On 24 March 2018 at 11:55, Chris Angelico <ros...@gmail.com> wrote:
>>> On Sat, Mar 24, 2018 at 10:49 PM, Paul Moore <p.f.mo...@gmail.com> wrote:
>>>> On 24 March 2018 at 09:18, Chris Angelico <ros...@gmail.com> wrote:
>>>>> 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.
>>>>
>>>> Wow, that's subtle (in a bad way!). I'd much rather that assignments
>>>> don't leak at all - that seems to me to be the only correct design,
>>>> although I understand that implementation practicalities mean it's
>>>> hard to do.
>>>>
>>>> There's a lot of context snipped here. Is this about the variant that
>>>> just does assignment without the new scope? If it is, then is there a
>>>> similar issue with the actual proposal, or is that immune to this
>>>> problem (I suspect that it's not immune, although the details may
>>>> differ).
>>>
>>> The code equivalence I gave above applies to the existing Python
>>> semantics. I'm not sure why the outermost iterable is evaluated in its
>>> enclosing context, but there must have been a good reason.
>>
>> Understood. But the current Python semantics doesn't have any way of
>> binding a name as part of that outermost iterable. It's the
>> interaction of the new feature (name binding in expressions) with the
>> existing implementation (the first iterable is outside the constructed
>> scope for the comprehension) that needs to be clarified and if
>> necessary modified to avoid nasty consequences.
>
> And that's one reason that these assignment expressions make more
> sense as statement-locals. It'd effectively still be local to the list
> comp, even though it's in the outer scope.

OK, although I still think the interaction between the two scopes is
sufficiently weird that it's worth spelling out...

Paul
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to