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()
Why x and y are different here?
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?
The reason for this is because the scope of class C is actually different than the scope of def func - and the different defaulting behaviors of scopes that python has for resolving names.
Here is basically how python looks for a variable in a step-by-step guide:
(If you remove ytop you get the exception NameError: name 'y' is not defined)
So basically, when the interpreter looks at the following section of code it does this
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 scope
Consider the following scenarios and the different outputs we would get in each case
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With