在if语句后出现"UnboundLocalError: 本地变量在赋值前被引用

41 投票
7 回答
235755 浏览
提问于 2025-04-17 18:50

当我尝试这段代码时:

tfile = open("/home/path/to/file",'r') 

def temp_sky(lreq, breq):
    for line in tfile:
        data = line.split()
        if (    abs(float(data[0]) - lreq) <= 0.1 
            and abs(float(data[1]) - breq) <= 0.1):            
            T = data[2]
    return T
print(temp_sky(60, 60))
print(temp_sky(10, -10))

我收到一个错误提示,内容是:

Traceback (most recent call last):
  File "tsky.py", line 25, in <module>
    print(temp_sky(10, -10))
  File "tsky.py", line 22, in temp_sky
    return T
UnboundLocalError: local variable 'T' referenced before assignment

第一个print正常工作,但第二个却出现了异常。我试着把T设为全局变量,但这样两个结果都是一样的。

到底出了什么问题,我该如何解决呢?

7 个回答

5

其他的回答都是对的:你没有设置默认值。不过,你的逻辑还有另一个问题:

你读取同一个文件两次。第一次读取后,光标已经到文件的末尾了,所以再读取一次就什么都得不到,循环也就不会执行。要解决这个问题,你可以做两件事:要么在每次调用函数时打开和关闭文件:

def temp_sky(lreq, breq):
    with open("/home/path/to/file",'r') as tfile:
        # do your stuff

这样做的缺点是每次都要打开文件。更好的方法是:

tfile.seek(0)

你可以在for line in tfile:循环之后这样做。这样可以把光标重置到文件开头,所以下次调用时就可以从头开始读取。

相关问题:

9

顺便说一下:我遇到同样的错误,但原因不同。我在这里分享这个答案,不是为了帮助提问者,而是为了那些可能因为这个标题而来到这里的人……他们可能犯了和我一样的错误。

我很困惑,为什么会出现“局部变量在赋值前被引用”的错误,因为我调用了一个我知道已经定义好的函数:

def job_fn(job):
  return job + ".job"

def do_something():
  a = 1
  b = 2
  job_fn = job_fn("foo")

do_something()

这段代码给出的错误是:

UnboundLocalError: local variable 'job_fn' referenced before assignment

我花了一段时间才发现我的明显问题:我使用了一个名为 job_fn 的局部变量,这让人看不到之前定义的 job_fn 函数。

46

你的 if 语句总是返回假,所以 T 只有在满足某个条件时才会被初始化,也就是说代码根本没有机会给 T 赋值(因此 T 也就没有被定义)。你应该把这个变量放在一个总是会执行的地方。

可以试试:

def temp_sky(lreq, breq):
    T = <some_default_value> # None is often a good pick
    for line in tfile:
        data = line.split()
        if abs(float(data[0])-lreq) <= 0.1 and abs(float(data[1])-breq) <= 0.1:
            T = data[2]
    return T

撰写回答