Список определен как глобальный в функции, но постоянно возникает ошибка, что список не определен-python

Я учусь на вводном Python курсе, который является моим первым знакомством с программированием. Любая помощь высоко ценится. Я создаю фрагмент кода, который должен определить функцию линейной регрессии для заданного набора входных данных из текстового файла. Я определил переменную, которая содержит список упорядоченных пар (x,y), как глобальные пары. Однако я продолжаю получать сообщение об ошибке, что пары не определены. Я не могу настроить какие-либо другие части моего кода, потому что этот список пуст, в результате чего другие списки, которые я получил из этого, также будут пустыми. Я действительно застрял в этом, я искал ответ на этом сайте и других, но я еще не нашел решения.

Это часть кода, который у меня есть:

#read values into tuple to seperate the spaces from X and Y values from the text file
#convert the tuple to a list containing (x,y) paris
    #the values are stored if we call the funciton
    #but the list of pairs doesn't seem to be global, it is empty when i just print(pairs)
def list_comprehension(in2):

    infile = open("in2",'r')
    global coordinates
    coordinates = (line.split() for line in infile)
    infile.close()
    global pairs
    pairs = [(float(x),float(y)) for x,y in coordinates]
    pairs.append(coordinates)

    return pairs 

#isolate x and y variables into seperate lists
    #same problem, the funciton operates fine
    #but the lists have nothing in them because pairs has nothing in it
X=[]
Y=[]
def isolate(X,Y):
    for (x,y) in pairs:
        X.append(x)
        Y.append(y)

    return X, Y

А ошибка вот в чем:

 File "C:/Python34/python/Program 5/p5 draft function and values.py", line 47, in isolate
    for (x,y) in pairs:
NameError: name 'pairs' is not defined

person mmb_rach    schedule 21.10.2015    source источник


Ответы (3)


Я предполагаю, что isolate вызывается в какой-то момент времени до list_comprehension, а это означает, что глобальное имя pairs еще не определено.

>>> def init():
...    global z
...    z = 2
... 
>>> z
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'z' is not defined
>>> init()
>>> z
2

МЕРЫ ПРЕДОСТОРОЖНОСТИ

Не рекомендуется использовать ключевое слово global, поскольку это затрудняет отслеживание расположения всех глобальных переменных. Вместо этого я рекомендую объявить pairs в вашей основной функции, а затем установить pairs = list_comprehension(...) и передать его в isolate(X,Y,pairs). См. Использование глобального ключевого слова в Python, как указано @r-nar в Комментарии.

person Almog    schedule 21.10.2015
comment
Спасибо, я собираюсь определить это в основном и сделать, как вы сказали, и я думаю, что это сработает. И я понимаю проблему, проблема в том, что я никогда не вызываю функцию list_comprehension в моей функции печати. Пары никогда не нужно печатать, они используются только в оставшейся части программы. В связи с этим я думаю, что ваш метод будет правильным способом сделать это. - person mmb_rach; 22.10.2015
comment
Когда я устанавливаю пары = list_comprehension(...), мы можем напечатать пары в основной функции и получить необходимые значения. Однако он также прикрепляется к концу [(0,28, 6,62), (0,5, 5,93), (0,67, 4,46), (0,93, 4,25), (1,15, 3,3), (1,38, 3,15), (1,6, 2,43). ), (1.98, 1.46), ‹объект-генератор ‹genexpr› по адресу 0x02F9C800›]. Я не уверен, что это такое, если я использую list_comprhension (in2), он говорит, что in2 не определен - person mmb_rach; 22.10.2015
comment
под (...) я имею в виду передать любые значения in2, которые вы хотели использовать. кажется, что вы жестко запрограммировали значение in2 как in2, поэтому вы можете полностью удалить аргумент in2 из сигнатуры метода. Что касается объекта генератора, вы должны увидеть wiki.python.org/moin/Generators. что объясняет, почему «объект генератора» добавлен в конце (вкратце это ссылка на объект генератора) - person Almog; 22.10.2015
comment
Также у вас не должно быть .append(coordinates), так как это уже делается в вашем понимании списка строкой выше. Вот почему вы получаете объект генератора. - person Almog; 22.10.2015

Ключевое слово global используется, когда вы объявляете глобальную область действия для переменной внутри функции. Это необходимо, когда вы хотите изменить глобальную переменную. Убедитесь, что вы объявили pairs вне функции.

https://docs.python.org/2/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python

person McGlothlin    schedule 21.10.2015

В сообщении об ошибке говорится, что проблема в pairs. Объявление global в list_comprehension не влияет на pairs, ему нужно собственное глобальное объявление.

def isolate(X,Y):
    global pairs
    for (x,y) in pairs:
        X.append(x)
        Y.append(y)

    return X, Y
person Barmar    schedule 21.10.2015