On 12/27/18, jf...@ms4.hinet.net <jf...@ms4.hinet.net> wrote:
>
> I still don't get it. When I change it to using list comprehension, the
> problem is still there. (it now has no late-binding variable, right? :-)
>
>>>> class Too:
> ...     XS = [15, 15, 15, 15]
> ...     Z4 = [val for val in XS]
> ...     Z5 = [XS[0] for val in XS]
> ...
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "<stdin>", line 4, in Too
>   File "<stdin>", line 4, in <listcomp>
> NameError: name 'XS' is not defined
>
> The problem confuse me is that is XS a local variable of the list
> comprehension?

XS is not a local variable in the scope of either comprehension. XS is
local to the class statement's scope. For each comprehension, an
iterator for the current object referenced by XS gets instantiated
(early binding) and passed as an argument to the comprehension scope.
If we disassemble the comprehension code, we find that this iterator
argument has the creatively illegal name ".0". (The bytecode
references it by its fast-locals-array index, not its weird name.)

In the Z5 case, XS is a non-local variable (late binding) in the
loop-body expression (left-hand side) of the comprehension. That's
common for Python code. In every iteration of the loop, the
interpreter looks up the object referenced by the name "XS", which can
change at any time (e.g. by another thread).
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to