UnboundLocalError:分配前引用了局部变量,为什么在这种情况下不应用LEGB规则

UnboundLocalError:分配前引用了局部变量,为什么在这种情况下不应用LEGB规则,第1张

UnboundLocalError:分配前引用了局部变量,为什么在这种情况下不应用LEGB规则

这似乎很奇怪(确实如此),但是 您并没有结束

class
,只是结束了
def
。该“ ê 以L简称nclosing”范围 ê
GB只是说说函数定义; 类块在这里不算在内。

这种奇怪的行为是历史上将类添加到Python的方式的产物。类范围不是实际范围。Python并不总是具有类,而怪异的“中间作用域”仅在类定义期间存在:在内部,类主体下的代码或多或少地只是

exec
在临时作用域下运行,并将结果分配给类名。当时,这是一种非常简单的“螺栓连接”方法,可将OOP纳入该语言,这也是Python之所以将明确的
self
东西作为有意的语言设计选择的原因。

要从

a_var
方法内部从“类范围”访问,您将必须通过
self.a_var
或使用属性访问
Test.a_var
。两者都应该起作用。您也可以在类定义期间在类级别直接访问它,但是由于您仍在临时范围内,这只是本地访问的另一个示例(
L EGB)。

在执行模型部分中对此进行了记录(尽管不是特别清楚)。

名称解析的上下文中,exec()和eval()的类定义块和参数是特殊的。类定义是可以使用和定义名称的可执行语句。这些引用遵循通常的名称解析规则,但在全局命名空间中查找未绑定的局部变量。类定义的名称空间成为该类的属性字典。
在一个类块中定义的名称范围限于该类块 ; 它没有扩展到方法的代码块–这包括理解和生成器表达式,因为它们是使用函数范围实现的。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5673778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存