我正在尝试对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
有人能解释函数定义的闭包和类定义之间的区别吗?
答案 0 :(得分:10)
词法作用域仅适用于函数名称空间,否则在类中定义的方法将能够“看到”类级属性(这是设计的 - 必须将这些属性作为self
的属性进行访问。法)。
导致类级别变量被方法引用跳过的相同限制也使nonlocal
关键字无法发挥其魔力。 (global
确实有效,因为这不依赖于词法范围机制)
答案 1 :(得分:4)
Python以不同的方式处理类和函数定义。例如,您的A.v
不是A的变量,而是它的属性。因此,类创建的命名空间不是范围。我并不感到惊讶nonlocal
因为你试图使用它而无效。