当前位置: 首页 > 面试题库 >

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

席安康
2023-03-14
问题内容

嗨,我对python中变量的作用域感到困惑。请解释以下片段之间的区别。

一世)

class Test(object):
    a_var = 1

    def a_func(self):
      self.a_var = self.a_var + 1
      print(self.a_var, '[ a_var inside a_func() ]')


   if __name__=='__main__':
     t=Test()
     t.a_func()

O / P:2 [a_func()内部的a_var]

class Test(object):
    a_var = 1

    def a_func(self):
      a_var = a_var + 1
      print(a_var, '[ a_var inside a_func() ]')


if __name__=='__main__':
   t=Test()
   t.a_func()

o / p:UnboundLocalError:分配前已引用局部变量’a_var’

为什么在第二种情况下不应用LEGB规则,它是否不能从类的封闭对象中获取值。请解释。提前致谢。


问题答案:

这似乎很奇怪(确实如此),但是 您并没有结束class,只是结束了def。该“ ê 以L简称nclosing”范围 ê
GB只是说说函数定义; 类块在这里不算在内。

这种奇怪的行为是历史上将类添加到Python的方式的产物。类范围不是实际范围。Python并不总是具有类,而怪异的“中间作用域”仅在类定义期间存在:在内部,类主体下的代码或多或少地只是exec在临时作用域下运行,并将结果分配给类名。当时,这是一种非常简单的“螺栓连接”方法,可将OOP纳入该语言,这也是Python之所以将明确的self东西作为有意的语言设计选择的原因。

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

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

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



 类似资料:
  • 问题内容: 认为我在这里疯了。 给我UnboundLocalError。我在这里错过了什么重要概念? 问题答案: 您正在分配一个全局变量,这意味着您需要将其 标记 为全局变量: 当您在局部范围内分配变量时,除非您先使用一条语句告诉python,否则将假定它是局部变量。

  • 问题内容: 以下代码引发UnboundLocalError: 错误: 我不知道为什么。有人能指出我正确的方向吗? 问题答案: 如果conn.cursor()引发异常,则将永远不会分配cur,因此,finally块中的代码将在分配之前引用cur。 尝试删除该try块并查看会发生什么,很可能conn.cursor()抛出了某种异常,您需要对它进行梳理。

  • 问题内容: 以下代码给出了错误 我怎样才能解决这个问题?谢谢你的帮助! 问题答案: 你可以通过传递参数而不是依赖全局变量来解决此问题

  • 问题内容: 我正在尝试使用XPATH定位器单击包含文本“ Clean feed crm”的span标签。我得到错误: 完整的错误跟踪: 如果我使用绝对完整的XPATH,则效果很好。相对的XPATH显示错误。 可以使用的完整绝对XPATH是: 相对的XPATH不起作用是: HTML是: 我的方法实现是: 从我的TestCase类,我调用方法: Globals.py是: 我也尝试过使用WebDrive

  • 问题内容: 我想知道你们是否可以提供帮助。我试图做一个简单的视图,它将用户发送到客户端创建表单,但是我一直收到此错误: 赋值之前引用的局部变量“ form” 查看我的代码,看不到有什么问题。 有人告诉我我哪里出问题了吗? 问题答案: 这是正在发生的事情: 没有输入该块。 变量未定义。 然后,你尝试在语句中引用变量。 至于解决方法,这确实是你要决定的。解决的方法取决于你希望代码执行的操作(如果请求方

  • 我在找两个数的lcm。但是当我运行这个程序时,我得到了一个错误:UnboundLocalError:在赋值之前引用了本地变量'lcm',为什么我会得到这个错误呢?我不明白我的代码出了什么问题。请帮帮我 这是我的代码: