【问题标题】:While-loop: UnboundLocalError: local variable referenced before assignmentWhile-loop: UnboundLocalError: 赋值前引用的局部变量
【发布时间】:2016-10-12 03:39:26
【问题描述】:

我正在使用 python 3.5。

所以我试图创建一个将 x 和 y 作为正浮点输入的函数,然后计算并返回 R = x - N * y,其中 N 是最大整数,因此 x > N * y。

我做了这个函数:

def floatme(x,y):

     N = 1

     while x <= N * y:
         R = x - N * y
         N = N+1

     return R

但在运行我的函数时,我收到以下错误:

UnboundLocalError:赋值前引用了局部变量“R”

我四处搜索,发现当函数中的分配变量已经在它之外分配时会发生这种情况。但是我的函数不是这样,所以我不明白为什么 Python 会抱怨?

【问题讨论】:

  • 你应该将 R 初始化为某个东西,如果 x > N*y 在开始时它永远不会被分配

标签: python python-3.x


【解决方案1】:

Rwhile 循环内定义。如果while 循环的条件最初不是真的,它的主体永远不会执行并且R 永远不会被定义。那么尝试return R就报错了。

为了解决这个问题,在进入循环之前将R初始化为某个东西。

如果不进入循环是错误条件,即调用者不应传入导致问题开始的值,则使用 try/except 结构捕获 UnboundLocalError 并引发更多适当的异常(例如ValueError)。

【讨论】:

    【解决方案2】:

    恐怕您的代码与 while x &lt;= N * y: 存在无限循环。
    x 的值在代码中永远不会增加。 (也许您打算改用&gt;=?)

    话虽如此,即使您在外部定义 R,您仍然会得到 UnboundLocalError。你必须告诉函数它是全局的。

    R = None # init
    def floatme(x,y):
        global R    # THIS IS THE KEY LINE
        N = 1
        while x >= N * y:   # changed to >=
            R = x - N * y
            N = N+1
    
        return R
    

    此时值得注意的是,这个函数只是在做x % y if x&gt;=y else None,所以我不确定我是否明白这里的意图。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2013-11-29
      • 2019-09-02
      • 1970-01-01
      • 2015-06-14
      • 2018-06-29
      • 2011-10-31
      • 2020-05-05
      • 1970-01-01
      相关资源
      最近更新 更多