首页 > 解决方案 > 解决 UnboundLocalError 的任何其他建议:分配前引用的局部变量 'val'

问题描述

我得到一个 UnboundLocalError: 在我的 if 语句中使用 NaN 时。如果我将 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))

标签: python

解决方案


正如其他人在评论中提到的那样,您的代码缺少处理没有条件评估为的情况的逻辑True

math.nan == math.nan评估为,False因此您的函数调用将永远不会导致任何if语句True因此val永远不会被初始化,这就是您得到UnboundLocalError.

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

最后比较nantonan对我来说似乎是多余的,因为在您的函数调用中传递的第三个参数是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))

推荐阅读