Python类型错误:Int不可订阅

时间:2015-07-23 02:14:32

标签: python list pygame

我正在使用pygame,尝试创建一个蛇游戏。当蛇已经“吃掉”(在食物之上)时,我无法得到我的代码。

我在课堂上设置了我的蛇,以及食物。

class Snake():
    def draw():
        for k in Snake.positionList:
        pygame.draw.rect(gameDisplay, BLACK, [k[0], k[1], block_size,  block_size])
    positionList = []
    length = 1
    direction = 0

class Food():
    position = [round(random.randrange(0, display_width - block_size), -1), round(random.randrange(0, display_height - block_size), -1)]
    def draw():
        pygame.draw.rect(gameDisplay, GREEN, [Food.position[0], Food.position[1], block_size, block_size])

我蛇的第一个“方形”定义如下。它导致浮动。

Snake.positionList.append([display_width / 2, display_height / 2])

我检测蛇是否超出食物的功能是引起错误的代码行TypeError: 'int' object is not subscriptable

def isEating(Snake, Food):
    if Snake.positionList[0][0] == Food.position[0][0] and Snake.positionList[0][1] == Food.position[0][1]:
        return True
    else:
        return False

我的困惑如下:Snake.positionListFood.position都没有将数字存储为整数(大概是浮点数)。此外,IDLE中类似的代码片段没有错误。

someList = [[2.5,5.7],[5.8,5.1],[1.0,2.5]]
print(someList[0][0] == someList[2][1])
#prints True

总而言之......我的错误意味着什么(特别是术语'可订阅')以及为什么当没有一个元素是整数时它会发生?

1 个答案:

答案 0 :(得分:3)

Subscriptable表示框中显示的内容:您可以将[0]这样的下标应用于其中。请注意,这与IndexError不同,在IndexError中,索引将超出范围(例如,在[1,2,3][4]的情况下)。

您应该打印Snake.positionListFood.position;你会发现他们不会成为一个列表列表(或者外部列表中至少有一个元素是Int,而不是列表)。

(提示:Food.position是1维)

备注

通过直接使用类而不是实例,您似乎有点滥用类作为命名空间的方式。这可能会在以后导致混淆。

您对类的定义也是关闭的:在Python 2中,它将是

class Snake(object):

继承自object。在Python 3中,它将是

class Snake:

没有括号,因为object的继承是隐式的(但如果你需要兼容Python 2,Python 2语法是有效且合理的。)