UnboundLocalError: локальная переменная, указанная перед присваиванием при чтении из файла
Я также попытался найти ответ, но я не понимаю ответы на другие подобные проблемы людей...
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
Первый оператор печати работает правильно, но второй не работает. Я попытался сделать T глобальной переменной, но это делает оба ответа одинаковыми! Пожалуйста помоги!
Ответы
Ответ 1
Ваш оператор if
всегда является ложным и T инициализируется только в том случае, если выполняется условие, поэтому код не достигает точки, в которой T
получает значение (и тем самым определяется/привязано). Вы должны ввести переменную в место, которое всегда выполняется.
Try:
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
Ответ 2
Другие ответы верны: у вас нет значения по умолчанию. Однако у вас есть еще одна проблема в вашей логике:
Вы дважды читаете один и тот же файл. Прочитав один раз, курсор находится в конце файла. Чтобы решить эту проблему, вы можете сделать две вещи: либо открыть/закрыть файл при каждом вызове функции:
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
FWIW: Я получил ту же ошибку по другой причине. Я размещаю ответ здесь не для пользы OP, но для тех, кто может оказаться на этой странице из-за своего названия... кто мог бы совершить ту же ошибку, что и я.
Я был смущен, почему я получал "локальную переменную, указанную перед назначением", потому что я звонил в FUNCTION, который, как я знал, уже был определен:
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
.
Ответ 4
Прежде чем начать, я хотел бы отметить, что я не могу проверить это, так как ваш script читает данные из файла, который у меня нет.
'T' определяется в локальной области для объявленной функции. В первом случае "T" присваивается значение "data [2]", потому что условное выражение выше, по-видимому, оценивает значение True. Поскольку второй вызов функции вызывает возникновение исключения UnboundLocalError, локальная переменная "T" становится установленной и условное присваивание никогда не запускается.
Поскольку вы, кажется, хотите вернуть первый бит данных в файл, соответствующий вашему утверждению conditonal, вы можете изменить свою функцию так, чтобы выглядеть следующим образом:
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
Таким образом, желаемое значение возвращается, когда оно найдено, и "Нет" возвращается, когда не найдены соответствующие данные.
Ответ 5
Вклад в пример 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
Чтобы решить эту ошибку, просто инициализируйте эту переменную выше этого цикла или инструкции. Пример var a =""
Ответ 7
В моем упражнении я столкнулся с такой же проблемой. Хотя это не связано, все же может дать некоторую ссылку. Я не получил никакой ошибки, как только я разместил функцию inner_result = 0 внутри. Надеюсь, поможет! Извините, если этот ответ не в контексте.
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)