Python 3.3.3:TypeError:list indices必须是整数,而不是float

时间:2014-02-06 16:58:36

标签: python python-2.7 python-3.x pygame

我有一个python 2.7.6程序,我想转换为3.3.3。

我收到错误:

File "H:\My Game Python 3,3\MoonSurvival.py", line 199, in run
  self.moon.levelStructure[x][y] = None

Traceback是:

Traceback (most recent call last):
  File "H:\My Game Python 3,3\MoonSurvival.py", line 591, in <module>
    Game().run()
  File "H:\My Game Python 3,3\MoonSurvival.py", line 199, in run
    self.moon.levelStructure[x][y] = None
TypeError: list indices must be integers, not float

但是当我查看levelStructure的代码时,没有任何错误。这是指定levelStructure的代码:

tempBlock = Block(x*64, y*64)
# add block to both and self.levelStructure
self.levelStructure[x][y] = tempBlock

正如您所见,levelStructure是tempBlock。由于它正在成倍增加,它似乎正在浮动。我知道除法它是两个斜杠/。我试图乘以'*',但我仍然得到错误。我并不完全熟悉3.3.3语法,因为我通常使用2.7.6。

区号:

class Block(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('data/images/moon.jpg')

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def render(self, surface):
        surface.blit(self.image, self.rect)

导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:4)

因为您要从Python 2.7转换 - &gt; Python 3.x,它几乎只是地板划分的一个问题。

我不确定您在哪里生成xy,但如果您在任何时候将这些数字除以任何数字,请确保使用//运算符在Python 3中,如果你期望一个整数结果。

在Python 2中,5/2 == 2并且您必须执行5/2.0才能获得浮点结果。在Python 3中,5/2 == 2.5并且您必须执行5//2才能获得除法的整数结果。每当你在xy上操作时,你可能会将它除以Python 2中给你一个整数的东西,但是在Python 3中你会留下这个浮点,所以您尝试将其用作列表索引... BOOM

答案 1 :(得分:0)

你传递一个浮点作为一个只接受整数的整数数组的索引。

如何在Python 3.3.3中尽可能简单地重现此错误:

>>> stuffi = []
>>> stuffi.append("foobar")
>>> print(stuffi[0])
foobar
>>> stuffi[0] = "failwhale"
>>> print(stuffi[0])
failwhale
>>> stuffi[0.99857] = "skipper"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not float

尝试将整数代码添加到变量中,以便:

self.levelStructure[x][y] = tempBlock

变为:

self.levelStructure[int(x])[int(y)] = tempBlock

如果可行,您可以将其添加到:

tempBlock = Block(x*64, y*64)

所以它看起来像:

tempBlock = Block(int(x*64), int(y*64))