如何在没有全局变量的情况下解决“在赋值之前引用的UnboundLocalError:局部变量'foo'错误?

时间:2015-09-17 19:31:09

标签: python function oop object global-variables

以下是我的代码的简化版本:

class foo:
    def __init__(self, thing):
        self.thing = thing

def bar():
    foo = foo('test')

bar()

这就是它产生的东西:

Traceback (most recent call last):
  File "filepath", line 8, in <module>
    bar()
  File "filepath", line 6, in bar
    foo = foo('test')
UnboundLocalError: local variable 'foo' referenced before assignment

我对此有两个问题。

首先,如何解决这个问题?经过一些谷歌搜索后,我发现在global foo行之前添加foo = foo('test')就可以了。但普遍的共识似乎是全局变量是要避免的坏事,那么有没有办法绕过这个不使用全局变量?

其次,为什么会发生这种情况?我理解函数只能访问在该函数内创建的变量(当然还有全局变量)。但我不是试图访问在函数之外定义的变量,我只是创建一个新变量。从逻辑上讲,为什么禁止在函数内部创建一个新对象(除非你首先将它声明为全局对象)?

2 个答案:

答案 0 :(得分:0)

解析器看到foo = ...后,会将foo标记为局部变量。一旦发生这种情况,您尝试调用foo('test')失败,因为本地变量foo尚未引用任何,更不用说可调用对象了。

您将不得不为正在创建的对象选择不同的名称。

答案 1 :(得分:0)

Python中的变量始终位于一个范围内。

尝试在读取全局变量foo时分配给局部变量foo

当您分配给不使用global关键字声明的变量时,它被假定为局部变量。因此,当您编写foo = foo()时,Python会假定foo是本地的,然后您会收到错误,在您写入之前,您会读取foo。