UnboundLocalError:从文件读取时在赋值之前引用的局部变量

use*_*508 34 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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

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
Run Code Online (Sandbox Code Playgroud)

第一个print语句正常工作,但第二个不起作用.我尝试将T设为全局变量,但这使得两个答案都相同!请帮忙!

shx*_*hx2 33

您的if语句始终为false,只有在满足条件时才会初始化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
Run Code Online (Sandbox Code Playgroud)


Dan*_*n H 6

FWIW:出于不同的原因,我得到了同样的错误.我在这里发布答案不是为了OP的利益,而是为了那些可能因为它的标题而最终出现在这个页面上的人的利益......我可能犯了同样的错误.

我很困惑为什么我得到"在赋值之前引用的局部变量",因为我正在调用一个我知道已经定义的函数:

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

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

do_something()
Run Code Online (Sandbox Code Playgroud)

这给了:

UnboundLocalError: local variable 'job_fn' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才看到我明显的问题:我使用了一个名为local的变量job_fn,它掩盖了查看先前函数定义的能力job_fn.

  • 错误的另一个可能原因。http://stackoverflow.com/questions/10506973/can-not-increment-global-variable-from-function-in-python (3认同)

jav*_*vex 5

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

您读取同一个文件两次。读取一次后,光标位于文件末尾,因此尝试再次读取它不会返回任何内容,并且永远不会进入循环。要解决此问题,您可以执行两件事: 在每次函数调用时打开/关闭文件:

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

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

tfile.seek(0)
Run Code Online (Sandbox Code Playgroud)

您可以在for line in tfile:循环之后执行此操作。它将光标重置到开头,以便下一次调用将从那里再次开始。

相关问题: