类定义中的Python非局部语句

时间:2011-03-28 23:31:29

标签: python class python-3.x python-nonlocal

我正在尝试对Python 3源代码中的范围进行一些分析,并且我一直坚持非局部语句语句在类定义中的工作方式。

据我了解,类定义在新的命名空间(称为dict)中执行其主体,并将类名绑定到类型(name,bases,dict)的结果。非局部x应该有效,只要它引用一个绑定在非局部范围内某处的变量。

从此我希望编译并运行以下代码:

class A:
    v = 1
    class B:
        nonlocal v
        v = 2

但是

失败了
SyntaxError: no binding for nonlocal 'v' found

,而以下代码运行完美

def A():
    v = 1
    class B:
        nonlocal v
        v = 2

有人能解释函数定义的闭包和类定义之间的区别吗?

2 个答案:

答案 0 :(得分:10)

词法作用域仅适用于函数名称空间,否则在类中定义的方法将能够“看到”类级属性(这是设计的 - 必须将这些属性作为self的属性进行访问。法)。

导致类级别变量被方法引用跳过的相同限制也使nonlocal关键字无法发挥其魔力。 (global确实有效,因为这不依赖于词法范围机制)

答案 1 :(得分:4)

Python以不同的方式处理类和函数定义。例如,您的A.v不是A的变量,而是它的属性。因此,类创建的命名空间不是范围。我并不感到惊讶nonlocal因为你试图使用它而无效。