关于Python:unboundlocalerror:局部变量引用的时候阅读从之前的配置文件

UnboundLocalError: local variable referenced before assignment when reading from file

我也试过寻找答案,但我不理解其他人类似问题的答案…

1
2
3
4
5
6
7
8
9
10
11
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)

我得到以下错误

1
2
3
4
5
6
7
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

第一个打印语句工作正常,但第二个打印语句不工作。我试过将t设为一个全局变量,但这两个答案是一样的!请帮助!


您的if语句总是错误的,只有在满足某个条件时才会初始化,因此代码不会到达T获取值(由此定义/绑定)的点。您应该在一个总是被执行的地方引入变量。

尝试:

1
2
3
4
5
6
7
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
2
3
4
5
6
7
8
9
def job_fn(job):
  return job +".job"

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

do_something()

这是给予:

1
UnboundLocalError: local variable 'job_fn' referenced before assignment

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


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

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

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

这就带来了每次都必须打开文件的缺点。更好的方法是:

1
tfile.seek(0)

你在你的for line in tfile:循环之后做这个。它将光标重置为开始,下次调用将从此处重新开始。


在我开始之前,我要注意的是,我不能实际测试这个,因为您的脚本从我没有的文件中读取数据。

"t"是在声明函数的本地作用域中定义的。在第一个实例中,"t"被赋值为"data[2]",因为上面的条件语句的计算结果显然为true。由于对函数的第二次调用导致发生"unboundLocalError"异常,因此将设置局部变量"t",并且永远不会触发条件赋值。

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

1
2
3
4
5
6
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

这样,当找到所需的值时,会返回该值;当找不到匹配的数据时,会返回"无"。


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


有助于铁氧体的例子,

1
2
3
4
5
6
7
8
9
10
11
12
13
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:本地变量'range'在赋值之前被引用"

1
2
3
4
5
def get_range(self):
    if self.battery_size <= 70:
        range = 240
    elif self.battery_size >= 85:
        range = 270


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

1
2
3
4
5
6
7
8
9
user_input = input("Enter multiple values separated by comma >")

def add_numbers(num_list):
    addition_result = 0
    for i in num_list:
        addition_result = addition_result + i
    print(addition_result)

add_numbers(user_input)