Global variable and local variable in Python classes

x = "xtop"
y = "ytop"
def func():
    x = "xlocal"
    y = "ylocal"
    class C:
        print x  #xlocal  of course
        print y  #ytop  why? I guess output may be 'ylocal' or '1'
        y = 1
        print y  #1  of course
func()
  1. Why x and y are different here?

  2. If I replace class C with a function scope I will get UnboundLocalError: local variable 'y' referenced before assignment,What is the difference between a class and a function in this situation?

1 answer

  • answered 2018-01-14 08:02 AlanSTACK

    The reason for this is because the scope of class C is actually different than the scope of def func - and the different defaulting behaviours of scopes that python has.

    Here is basically how python looks for a variable

    • Look in current scope
    • If current scope doesn't have it -> use nearest enclosing scope
    • If current scope has it, but not yet defined -> use global scope
    • If current scope has it, and already defined -> use it
    • else blow up

    (If you remove ytop you get a NameError: name 'y' is not defined)

    So basically, when the interpreter looks at the following section of code it goes

    class C:
        print(x) # need x, current scope no x  -> default to nearest (xlocal)
        print(y) # need y, current scope yes y -> default to global (ytop)
                 #         but not yet defined 
        y = 1
        print(y) # okay we have local now, switch from global to local
    

    Consider the following scenarios

    1) class C:
        print(x)
        print(y)
    
    >>> xlocal
    >>> ylocal
    
    2) class C:
        y = 1
        print(x)
        print(y)  
    
    >>> xlocal
    >>> 1
    
    3) class C:
        print(x)
        print(y)
        x = 1
    
    >>> xtop
    >>> ylocal