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

Chris Angelico rosuav at gmail.com
Thu Dec 27 01:18:30 EST 2018


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.

ChrisA


More information about the Python-list mailing list