类定义中的Python非局部语句

Python nonlocal statement in a class definition

我试图在python 3源代码中对作用域进行一些分析,我一直在研究非本地语句在类定义中的工作方式。

据我所知,类定义在一个新的名称空间(称为dict)内执行其主体,并将类名绑定到类型(name、base、dict)的结果。只要非局部X引用一个在封闭的非局部范围内绑定的变量,它就应该工作。

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

1
2
3
4
5
class A:
    v = 1
    class B:
        nonlocal v
        v = 2

但这失败了

1
SyntaxError: no binding for nonlocal 'v' found

以下代码运行良好

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

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


词法范围仅适用于函数命名空间,否则类内定义的方法将能够"查看"类级属性(通过设计,这些属性必须作为方法内self的属性访问)。

同样的限制也会导致类级变量被方法的引用跳过,从而使nonlocal关键字无法发挥其魔力。(global确实有效,因为它不依赖词汇范围界定机制)


python处理类和函数定义有很大的不同。例如,您的A.v不是它的变量,而是它的一个属性。因此,类创建的命名空间不是作用域。我并不感到惊讶,因为你试图使用它,所以nonlocal不起作用。