这是一个纯粹关于语言力学的问题,而不是最佳实践。我主要对python 3感兴趣。
假设我们有以下内容:
x = 5
def foo():
return x + 1 # Succeeds
def foo2():
x = x + 1
return x # Fails
class Bar(object):
x = x + 1 # Succeeds, Why?
def some_method(self):
return x
bar_instance = Bar()
众所周知,调用foo()会成功,因为x将从全局范围中检索。
众所周知,foo2()将因UnboundLocalError而失败,因为赋值左侧的x的存在会创建一个掩盖全局的局部变量,这将导致右侧的表达式失败。这有点不直观(我希望本地x可以从全局x初始化)但我理解它背后的机制。
然而,Class Bar将成功初始化。它创建了一个类范围变量并从全局初始化,这正是我所期望的。虽然这很好,但对我来说有点不协调。为什么它没有遇到与foo2()相同的掩蔽问题?在典型的LEGB范围层次结构之外的现有范围内,是否存在一些魔法?