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

时间:2013-03-12 17:14:41

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

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

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

我很困惑,为什么我得到&#34;在分配前引用的局部变量&#34;因为我正在调用一个我知道已定义的功能:

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

答案 2 :(得分:4)

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

你读了两次同一个文件。读取一次后,光标位于文件的末尾。要解决这个问题,您可以做两件事:在每次函数调用时打开/关闭文件:

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

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

tfile.seek(0)

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

答案 3 :(得分:1)

在开始之前,我想注意我实际上无法测试这个,因为你的脚本从我没有的文件中读取数据。

'T'在声明的函数的局部范围中定义。在第一个实例中,'T'被赋值为'data [2]',因为上面的条件语句显然评估为True。由于对函数的第二次调用导致发生'UnboundLocalError'异常,因此局部变量'T'被设置并且条件赋值永远不会被触发。

由于您似乎想要返回与您的条件语句匹配的文件中的第一位数据,您可能希望将您的函数修改为如下所示:

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):            
            return data[2]
    return None

这样找到所需的值,找到匹配的数据时返回'None'。

答案 4 :(得分:0)

我的练习中遇到了同样的问题。虽然没有关系,但可能会给一些参考。一旦我在函数中放置了addition_result = 0,我没有收到任何错误。希望能帮助到你!如果这个答案不在上下文中,请道歉。

  <servlet>
<servlet-name>FileUploadDBServlet</servlet-name>
**<servlet-class>com.db.FileUploadDBServlet</servlet-class>**
 </servlet>
<servlet-mapping>
**<servlet-name>com.db.FileUploadDBServlet</servlet-name>**
<url-pattern>/FileUploadDBServlet</url-pattern>

答案 5 :(得分:0)

有助于ferrix的例子,

class Battery():

    def __init__(self, battery_size = 60):
        self.battery_size = battery_size
    def get_range(self):
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
        range = 270

        message = "This car can go approx " + str(range)
        message += "Fully charge"
        print(message)

我的消息将不会执行,因为我的条件都没有实现,因此在分配之前接收“UnboundLocalError:局部变量'范围'”

def get_range(self):
    if self.battery_size <= 70:
        range = 240
    elif self.battery_size >= 85:
        range = 270

答案 6 :(得分:0)

要解决此错误,只需在该循环或语句上方初始化该变量。例如var a =""