On Wed, Dec 26, 2018 at 11:21 PM Chris Angelico <ros...@gmail.com> wrote:
>
> On Thu, Dec 27, 2018 at 1:56 PM <jf...@ms4.hinet.net> wrote:
> >
> > I saw the code below at stackoverflow. I have a little idea about the scope 
> > of a class, and list comprehension and generator expressions, but still 
> > can't figure out why Z4 works and Z5 not. Can someone explain it? (in a 
> > not-too-complicated way:-)
> >
> > class Foo():
> >     XS = [15, 15, 15, 15]
> >     Z4 = sum(val for val in XS)
> >     try:
> >         Z5 = sum(XS[i] for i in range(len(XS)))
> >     except NameError:
> >         Z5 = None
> >
> > print(Foo.Z4, Foo.Z5)
> > >>> 60 None
> >
>
> Class scope is special, and a generator expression within that class
> scope is special too. There have been proposals to make these kinds of
> things less special, but the most important thing to remember is that
> when you create a generator expression, it is actually a function.
> Remember that a function inside a class statement becomes a method,
> and that inside the method, you have to use "self.X" rather than just
> "X" to reference class attributes. That's what's happening here.

Except you can't use "self" either because the class doesn't exist yet
at the time the generator expression is being evaluated. Nor can you
use "self" generally even if you wait until the class does exist
before you iterate over the generator, because while a generator
expression may scope like a function, and may under the hood be
implemented as a function, a generator object is not a function object
and will not create a method.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to