Python - имя переменной не определено - PullRequest
0 голосов
/ 02 января 2019

Это мой (сокращенный) код.

race1names = ["Jeff", "Paul", "Mark"]
race1odds = [5, 6, 7]

class Horse:
    def __init__(self, name, odds, age, weight):
        self.name = name
        self.odds = odds
        self.age = age
        self.weight = weight

def Horsecreate():
    hcount = 0
    horse = {}
    while hcount < 3:
        cname = race1names[hcount]
        codds = race1odds[hcount]
        cage = 3
        cweight = 3

        for i in range(0, 3):
            horse[i] = Horse(cname, codds, cage, cweight)

        hcount +=1

Horsecreate()

print(horse0.name)
print(horse1.name)

Моя ошибка:

File "file.exe", line 26, in <module>
    print(horse0.name)
NameError: name 'horse0' is not defined

Я попробовал несколько вещей, но безрезультатно. Насколько мне известно, это должно работать?

Обновление

Просмотрев оба ваших ответа, я изменил несколько вещей с помощью кода. Новая ошибка.

Кроме того, я не прояснил свои намерения. Я в основном хочу запустить эту функцию, которая будет рекурсивно извлекать различные переменные, добавляя их к новому экземпляру класса вместе как новый «конный актер», если это имеет смысл (я довольно новичок в кодировании).

В этом случае я хочу, чтобы он создал лошадь [0], которая будет "Джефф", с коэффициентом 5.

лошадь [1], которая будет иметь шансы 6

и лошадь [2], которая будет иметь шансы 7

(из двух простых тестовых списков "race1names" и "race1odds")

В конечном счете, я бы хотел иметь несколько лошадей со своими независимыми ценностями. Однако это всего лишь тестовый сценарий, более сложный будет добавлен позже.

Обновленный код:

race1names = ["Jeff", "Paul", "Mark"]
race1odds = [5, 6, 7]

horse = {}

class Horse:
    def __init__(self, name, odds, age, weight):
        self.name = name
        self.odds = odds
        self.age = age
        self.weight = weight

def Horsecreate():
    for i in range(0, 2):
        cname = race1names[i]
        codds = race1odds[i]
        cage = 3
        cweight = 3
        horse[i] = Horse(cname, codds, cage, cweight)

        return horse


horse = Horsecreate()

print(horse[0].name)
print(horse[1].name)
print(horse[2].name)

С ошибкой:

Jeff
Traceback (most recent call last):
  File "file", line 27, in <module>
    print(horse[1].name)
KeyError: 1

Что выглядит довольно просто, но, опять же, предпринято несколько попыток, ни одна из которых не сработала.

Примечательно, что «Джефф» напечатан, показывая его вид работ.


После удаления возврата он теперь дает мне:

Traceback (most recent call last):
  File "file", line 26, in <module>
    print(horse[0].name)
TypeError: 'NoneType' object is not subscriptable

Спасибо, очень благодарна за быструю помощь


В ответ на @gilch я удалил переназначение и вернулся. Теперь выдает ошибку:

print(horse[0].name)
KeyError: 0

Как будто он не назначен. Вот текущий код:

race1names = ["Jeff", "Paul", "Mark"]
race1odds = [5, 6, 7]
global horse
horse = {}

class Horse:
    def __init__(self, name, odds, age, weight):
        self.name = name
        self.odds = odds
        self.age = age
        self.weight = weight

def Horsecreate():
    for i in range(0, 2):
        cname = race1names[i]
        codds = race1odds[i]
        cage = 3
        cweight = 3
        horse[i] = Horse(cname, codds, cage, cweight)


print(horse[0].name)
print(horse[1].name)
print(horse[2].name)

1 Ответ

0 голосов
/ 02 января 2019

Добавьте global horse в Horsecreate и измените печать на print(horse[0].name)

Переменная horse является локальной для функции Horsecreate.Функции создают локальную область видимости в Python.Назначения, созданные внутри функции, не видны за ее пределами.Ключевое слово global делает его видимым вне функции вместо локального.Вместо этого вы могли бы также объявить horse = {} вне функции.

И как Python узнает, что 0 - это не просто часть имени новой переменной, когда вы говорите horse0?Вы должны включить оператор подписки [] так же, как и при его назначении.


Ваши вложенные циклы также не имеют смысла.Вы выбросите всех лошадей, созданных до последнего цикла while.


Обновленная версия имеет возврат внутри цикла for.Это немедленно завершает цикл, поэтому вы получаете только один цикл, а не три, как вы хотели.Вам не нужно возвращать и переназначать horse, если он глобальный.Но если вы возвращаете его после цикла, он не должен быть глобальным.Делай одно или другое.

...