On 04Jul2018 1021, Tim Peters wrote:
Same as now, `i` is local to the synthetic nested function created for the genexp.  The scope of `a` is determined by pretending the assignment occurred in the block containing the outermost (textually - static analysis) comprehension.  In this case, `a = anything` before the `return` would establish that `a` is local to `f`, so that's the answer:  `a` is local to `f`.  If `a` had been declared global in `f`, then `a` in the genexp would be the same global `a`.  And similarly if `a` had been declared nonlocal.in <http://nonlocal.in> `f`.

In all cases the scope resolution is inherited from the closest containing non-comprehension/genexp block, with the twist if that if a name is unknown in that block, the name is established as being local to that block.  So your example is actually the subtlest case.

Okay, so as far as the specification goes, saying "assignment expressions in comprehensions get or create a cell variable in the defining scope and update its value" satisfies me just fine (or some other wording that more closely mirrors the actual behaviour - all my work here is on my own compiler, not the actual CPython one, and I don't know that they're identical).

I don't think this should be left assumed by the PEP. If it's likely to be a restriction on other implementations to say "cell variable", then say "For example, in CPython, ..."

 > From the any()/all() examples, it seems clear that the target scope for
 > the assignment has to be referenced from the generator scope (but not
 > for other comprehension types, which can simply do one transfer of the
 > assigned name after fully evaluating all the contents).

I don't think that follows.  It _may_ in some cases.  For example,
[SNIP]
_While_ the list comprehension is executing, it needs to rebind f's `i` on each iteration so that the call to `g()` on each iteration can see `i`'s then-current value.

Good point. My statement above captures this nuance, as far as I'm concerned. (Same for the frame lifetime discussion, which I snipped).

Cheers,
Steve
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to