为什么不使用类变量来掩盖全局范围?

时间:2017-10-10 16:53:01

标签: python python-3.x

这是一个纯粹关于语言力学的问题,而不是最佳实践。我主要对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范围层次结构之外的现有范围内,是否存在一些魔法?

0 个答案:

没有答案