Ask for help about class variable scope (Re: Why doesn't a dictionary work in classes?)

Ian Kelly ian.g.kelly at gmail.com
Thu Dec 27 11:29:38 EST 2018


On Wed, Dec 26, 2018 at 11:21 PM Chris Angelico <rosuav at gmail.com> wrote:
>
> On Thu, Dec 27, 2018 at 1:56 PM <jfong at 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.


More information about the Python-list mailing list