解决UnboundLocalError的任何其他建议:在赋值之前'val'引用局部变量



在我的if语句中使用NaN时,我得到一个UnboundLocalError。如果我将 NaN 设置为 0,那么代码工作正常。但是,代码需要使用 NaN 而不是 0。

我已经阅读了有关UnboundLocalError的大部分主题:但是我没有找到我要找的东西。

import math
from math import nan as NaN
def interest(A, P, R, N):
    if R == NaN:
        val = (A/P)**(1/float(N))-1
    elif P == NaN:
        val = A/(1+R)**N
    elif A == NaN:
        val = P * (1 + R)**N
    elif N == NaN:
        val = (math.log(A)- math.log(P))/ math.log(1+R)
    return val
    print(interest(1000, 200, NaN, 5))

正如注释中提到的其他人,您的代码缺少处理没有任何条件计算结果为True的情况的逻辑。

此外,math.nan == math.nan计算结果为 False,因此您的函数调用永远不会导致任何if语句被True因此val永远不会初始化,这就是您获得UnboundLocalError的原因。

有一个 else 子句,它应该返回一些适当的值或只返回 None

最后,将nannan进行比较对我来说似乎是多余的,因为在您的函数调用中传递的第三个参数是NaN

这只是对代码的轻微修改,它可以工作。

import math
from math import nan

def interest(A, P, R, N):
    if R is nan:
        val = (A / P) ** (1 / float(N)) - 1
    elif P is nan:
        val = A / (1 + R) ** N
    elif A is nan:
        val = P * (1 + R) ** N
    elif N is nan:
        val = (math.log(A) - math.log(P)) / math.log(1 + R)
    else:
        val = None
    return val
print(interest(1000, 200, 'test', 5))

首先,由于缩进错误,代码中的 print 语句永远不会打印任何内容,但我想您已经意识到了这一点。

其次,你会得到UnboundLocalError,因为val在返回之前没有被分配。有趣的问题是,为什么。这里的问题出在R == NaN(及以下)上,因为根据定义,NaN == NaNFalse .因此,永远不会分配val。当你想检查时,如果某个变量是NaN,你可以使用R is NaNR in [NaN](参见为什么在numpy中'nan == nan'是假的,而[nan]中的nan是真的?)。

请注意,使用else(这通常是很好的方式)可以给你一个提示,这里发生了什么。

最新更新