【问题标题】:UnboundLocalError: local variable .. referenced before assignmentUnboundLocalError:局部变量..在赋值之前引用
【发布时间】:2015-07-18 19:58:34
【问题描述】:

我从 python 开始。我正在尝试一个非常简单的类结构,但出现错误。

这是我的脚本:

class controller:

    def initLocal(self):
        path = input('path:')
        local = local()
        local.path = path
        return local


class location:
    pass



class local(location):
    path = None



controller = controller()
local = controller.initLocal()  

这是我在控制台中得到的结果:

path:a
Traceback (most recent call last):
  File "path\to\test.py", line 21, in <module>
    local = controller.initLocal();    
  File "path\to\test.py", line 5, in initLocal
    local = local();
UnboundLocalError: local variable 'local' referenced before assignment

我搜索了这个错误,发现它通常与不正确的范围有关。但是,我看不到我在这里做错了什么。拥有与类同名的类实例是否“非法”?

如果我将 initLocal() 方法更改为:

def initLocal(self):
    path = input('path:')
    locale = local()
    locale.path = path
    return locale

它有效,但我不知道为什么,因为 controller = controller() 不会导致任何问题。

谁能告诉我我做错了什么?我觉得它可能是非常明显的东西,但我无法弄清楚它是什么。

【问题讨论】:

  • 对不起,我要问:分号是怎么回事?你在 python 中不需要它们。
  • 你也应该把你的类名大写,因为我觉得绑定发生了一些奇怪的事情。
  • @NightShadeQueen 你是对的。我只是在 php 中编写脚本,所以我偶然添加了它们。感谢您的指正。无论如何,我在我的脚本中删除了它们,但错误保持不变。
  • @IanAuld python 中的类名是必需的,还是只是一个偏好?
  • 它是样式指南的一部分,但在这种情况下,您要将类的名称重新绑定到该类的实例。 Python 应该如何区分 controller 变量和 controller 类?

标签: python scope


【解决方案1】:
class Location:
    pass

class Local(location):
    path = None

class Controller:
    def initLocal(self):
        path = raw_input('path:')
        local = Local()
        local.path = path
        return local

controller = Controller()
local = controller.initLocal()

【讨论】:

  • 感谢您的回答。对于其他用户,我想补充一下为什么这是必要的原因:在 python 中,类实例不能与类同名。如果我错了,请纠正我。
  • 在 Python(我相信大多数其他语言)中,没有任何东西可以与其他任何东西同名。一旦您将符号 foo 绑定到任何东西并执行分配将重新绑定该符号。因此,如果您有class foo,然后在您的代码中,您在该范围内的任何其他时间都执行foo = some_function(),您尝试引用foo,您将引用该函数的结果而不是您的类。看到foo = Foo()很正常,需要注意的是Foo != foo
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 2012-11-14
  • 2013-11-29
  • 2019-09-02
  • 1970-01-01
  • 2015-06-14
  • 2018-06-29
  • 2011-10-31
相关资源
最近更新 更多