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()
为什么x和y在这里有所不同?
如果我用函数范围替换class C
,我将获得UnboundLocalError: local variable 'y' referenced before assignment
,在这种情况下,类和函数之间有什么区别?
答案 0 :(得分:3)
原因是因为class C
的范围实际上与def func
的范围不同 - 以及python具有的范围的不同默认行为。
这里基本上是python如何查找变量
(如果您移除ytop
,则会获得NameError: name 'y' is not defined
)
所以基本上,当解释器查看下面的代码部分时,
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
考虑以下场景
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