Python-未定义变量名

时间:2019-01-02 02:47:45

标签: python variables defined

这是我的(缩短的)代码。

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

我尝试了一些尝试,但无济于事。据我所知这应该工作吗?

更新

查看了两个答案后,我对代码进行了一些更改。新错误。

我也没有澄清我的意图。我基本上想运行此函数,它将以递归的方式提取各种变量,并将它们作为新的“ horse actor”一起添加到新的类实例中(如果这是合理的话)(我对编码是相当陌生的。)

在这种情况下,我希望它创建马[0],他将是“ Jeff”,赔率是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 :(得分:4)

global horse中添加Horsecreate,然后将打印内容更改为print(horse[0].name)

horse变量是Horsecreate函数的局部变量。函数在Python中创建局部作用域。在函数内部创建的分配在函数外部不可见。 global关键字使它在函数外部而不是本地可见。您也可以在函数外声明horse = {}

当您说0时,Python如何知道horse0不仅是新变量名的一部分?您必须包括[]下标运算符,就像您分配它时一样。


您的嵌套循环也没有意义。您将扔掉最后一个while循环之前的所有马匹。


更新的版本在for循环内有一个返回值。这样会立即结束循环,因此您只会得到一个循环,而不是您想要的三个循环。如果它是全局的,则根本不需要返回并重新分配horse。但是,如果您在循环后返回了它,则它不必是全局的。做一个或另一个。