在if语句后出现"UnboundLocalError: 本地变量在赋值前被引用
当我尝试这段代码时:
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