以下是我的代码的简化版本:
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')
就可以了。但普遍的共识似乎是全局变量是要避免的坏事,那么有没有办法绕过这个不使用全局变量?
其次,为什么会发生这种情况?我理解函数只能访问在该函数内创建的变量(当然还有全局变量)。但我不是试图访问在函数之外定义的变量,我只是创建一个新变量。从逻辑上讲,为什么禁止在函数内部创建一个新对象(除非你首先将它声明为全局对象)?
答案 0 :(得分:0)
解析器看到foo = ...
后,会将foo
标记为局部变量。一旦发生这种情况,您尝试调用foo('test')
失败,因为本地变量foo
尚未引用任何,更不用说可调用对象了。
您将不得不为正在创建的对象选择不同的名称。
答案 1 :(得分:0)
Python中的变量始终位于一个范围内。
尝试在读取全局变量foo
时分配给局部变量foo
。
当您分配给不使用global关键字声明的变量时,它被假定为局部变量。因此,当您编写foo = foo()
时,Python会假定foo
是本地的,然后您会收到错误,在您写入之前,您会读取foo。