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设为一个全局变量,但这两个答案是一样的!请帮助!
您的
尝试:
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 |
我花了一段时间才发现我明显的问题:我使用了一个名为
其他答案是正确的:您没有默认值。但是,您的逻辑中还有另一个问题:
你读了同一个文件两次。读取一次后,光标位于文件的末尾。要解决这个问题,您可以做两件事:在每次函数调用时打开/关闭文件:
1 2 3 | def temp_sky(lreq, breq): with open("/home/path/to/file",'r') as tfile: # do your stuff |
这就带来了每次都必须打开文件的缺点。更好的方法是:
1 | tfile.seek(0) |
你在你的
在我开始之前,我要注意的是,我不能实际测试这个,因为您的脚本从我没有的文件中读取数据。
"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 |
这样,当找到所需的值时,会返回该值;当找不到匹配的数据时,会返回"无"。
要解决此错误,只需初始化该循环或语句上方的变量。例如
有助于铁氧体的例子,
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) |