A newbie quesiton: local variable in a nested funciton

Chris Angelico rosuav at gmail.com
Sun Dec 27 01:32:17 EST 2015


On Sun, Dec 27, 2015 at 3:11 PM,  <jfong at ms4.hinet.net> wrote:
> Last night I noticed that Python does not resolve name in "def" during import, as C does in the compile/link stage, it was deferred until it was referenced (i.e. codes was executed). That's OK for Anyway codes has to be debugged sooner or later. I just have to get used to this style.
>
> But check these codes, it seems not.
> -------
> x = 1  # a global variable
> print(x)
>
> class Test:
>     x = 4  # a class attribute
>     print(x)
>     def func(self):
>         print(x)
>
> x1 = Test()
> x1.x = 41  # a instance's attribute
> x1.func()  # it's 1 but 41 was expect:-(
> --------
>
> --Jach

When you import this module, it runs all top-level code. So the
'print' at the top will happen at import time.

Among the top-level statements is a class definition. When that gets
run (to construct the class itself - distinct from instantiating it,
which happens further down), it builds a class by executing all the
statements in it, in order. That results in that value of x being
printed, and then defines a function.

The function definition is being run at time of class construction,
and it creates a new attribute on the Test class. At that time, the
function body isn't actually executed (as you might expect). However,
it's worth noting that the function does not inherit class scope. The
unadorned name 'x' references the global. If you want to access
class-scope names from inside methods, you need to say 'self.x', which
also applies to instance attributes. That's what would do what you
expect here.

ChrisA



More information about the Python-list mailing list