[英]Python nonlocal statement in a class definition
我正在尝试对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
任何人都可以解释函数定义的闭包和类定义之间的区别吗?
词法作用域仅适用于函数名称空间,否则在类中定义的方法将能够“看到”类级别属性(这是设计 - 这些属性必须作为方法内的self
属性进行访问)。
导致类级别变量被方法引用跳过的相同限制也使nonlocal
关键字无法发挥其魔力。 (虽然global
确实有效,因为这不依赖于词法范围机制)
Python以不同的方式处理类和函数定义。 例如,您的Av
不是A的变量,而是它的属性。 因此,类创建的命名空间不是范围。 我并不感到惊讶的是,当你试图使用它时, nonlocal
不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.