【问题标题】:How can I get around "UnboundLocalError: local variable 'foo' referenced before assignment" errors without global variables?如何在没有全局变量的情况下解决“UnboundLocalError:分配前引用的局部变量'foo'”错误?
【发布时间】:2015-09-17 19:31:09
【问题描述】:

这是我的代码的简化版本:

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

关于这个我有一个两部分的问题。

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

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

【问题讨论】:

  • 发生这种情况是因为您认为自己很聪明,将局部变量与外部范围内的某物同名。

标签: python function oop object global-variables


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Python 中的变量总是在 一个 范围内。

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2020-03-17
      • 2017-08-10
      • 2020-01-16
      • 2019-12-05
      相关资源
      最近更新 更多