Подтвердить что ты не робот

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 глобальной переменной, но это делает оба ответа одинаковыми! Пожалуйста помоги!

4b9b3361

Ответ 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)