<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 24 March 2018 at 21:49, Paul Moore <span dir="ltr"><<a href="mailto:p.f.moore@gmail.com" target="_blank">p.f.moore@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 24 March 2018 at 09:18, Chris Angelico <<a href="mailto:rosuav@gmail.com">rosuav@gmail.com</a>> wrote:<br>
> So the first (outermost) iterable is actually evaluated in the<br>
> caller's scope, but everything else is inside a subscope. Thus an<br>
> assignment inside that first iterable WILL leak into the surrounding<br>
> scope; but anywhere else, it won't.<br>
<br>
</div></div>Wow, that's subtle (in a bad way!). I'd much rather that assignments<br>
don't leak at all - that seems to me to be the only correct design,<br>
although I understand that implementation practicalities mean it's<br>
hard to do.<br></blockquote><div><br></div><div>We can't do that because it would make comprehensions nigh-unusable at class scope (or, equivalently, when using exec with a separate locals namespace):<br><br></div><div>    class C:<br></div><div>        _sequence = "a b c d".split()<br></div><div>        _another_sequence = [f(item) for item in _sequence]<br><br></div><div>"_sequence" needs to be resolved in the class scope and passed in as an argument in order for that to work, as the nested scope can't see it directly (since the implicit nested scope works like any other method definition for name resolution purposes).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

There's a lot of context snipped here. Is this about the variant that<br>
just does assignment without the new scope? If it is, then is there a<br>
similar issue with the actual proposal, or is that immune to this<br>
problem (I suspect that it's not immune, although the details may<br>
differ).<br></blockquote><div><br></div><div>PEP 572 is *mostly* immune, in that it's only the rest of the same statement that can see the name binding.<br><br></div><div>The variant that *doesn't* introduce statement local scoping just leaks outright into the surrounding scope.<br></div><div><br></div><div>Cheers,<br></div><div>Nick.<br clear="all"></div></div><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>