unbundlocalerror:从fi读取时在赋值之前引用的局部变量

2024-04-19 04:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我也试过寻找答案,但我不明白其他人类似问题的答案。。。

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)

我得到以下错误

7.37052488
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设为全局变量,但这会使两个答案相同!请帮忙!


Tags: 答案indatareturnlineabsfloattemp
3条回答

FWIW:我得到同样的错误是因为另一个原因。我把答案贴在这里并不是为了OP的利益,而是为了那些可能因为标题而最终登上这一页的人的利益。。。他可能犯了和我一样的错误。

我搞不懂为什么要得到“赋值前引用的局部变量”,因为我正在调用一个已知已定义的函数:

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先前函数定义的功能。

您的if语句始终为false,并且只有在满足某个条件时才会初始化,因此代码不会到达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

其他答案是正确的:您没有默认值。然而,你的逻辑还有一个问题:

你读了同一个文件两次。读取一次之后,光标位于文件的末尾。要解决此问题,可以执行两项操作:在每次调用函数时打开/关闭文件:

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

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

tfile.seek(0)

在循环后执行此操作。它将光标重置为开始,下次调用将再次从那里开始。

相关问题 更多 >