我在Python 3.4中编写了一些简单的游戏。我是Python的新手。代码如下:
def shapeAt(self, x, y):
return self.board[(y * Board.BoardWidth) + x]
引发错误:
TypeError: list indices must be integers, not float
现在我发现,当Python"认为" list参数不是整数。你知道如何解决这个问题吗?
答案 0 :(得分:10)
int((y * Board.BoardWidth) + x)
使用int
将最接近的整数逼近零。
def shapeAt(self, x, y):
return self.board[int((y * Board.BoardWidth) + x)] # will give you floor value.
并且使用math.floor
(通过m.wasowski的帮助)获得最低价值
math.floor((y * Board.BoardWidth) + x)
答案 1 :(得分:4)
如果x
,y
是表示数字文字的数字或字符串,则可以使用int
强制转换为整数,而浮点值则会浮动:
>>> x = 1.5
>>> type(x)
<type 'float'>
>>> int(x)
1
>>> type(int(x))
<type 'int'>
答案 2 :(得分:2)
这可能是因为您的索引类型为float
,其中这些索引应为ints
(因为您将它们用作数组索引)。我不会使用int(x)
,我想您可能打算通过int
(如果没有,请使用return self.board[(int(y) * Board.BoardWidth) + int(x)]
。
您可能还希望获得最低价值以获取您的索引,以下是如何操作:
import math
def shapeAt(self, x, y):
return self.board[math.floor((y * Board.BoardWidth) + x)]
您还可以使用Python的type()
函数来识别变量的类型。
答案 3 :(得分:1)
您需要检查的x和y的类型是什么,然后使用int
将它们转换为整数类型:
def shapeAt(self, x, y):
return self.board[(int(y) * Board.BoardWidth) + int(x)]
如果你想先存储它们:
def shapeAt(self, x, y):
x,y = int(x),int(y)
return self.board[(y * Board.BoardWidth) + x]
答案 4 :(得分:0)
基本上,您只需拨打int()
内置电话:
def shapeAt(self, x, y):
return self.board[int((y * Board.BoardWidth) + x))
但是,如果您想将它用于练习或脏脚本以外的任何内容,您应该考虑处理边缘情况。如果你在某处犯了错误并将奇怪的值作为参数怎么办?
更强大的解决方案是:
def shapeAt(self, x, y):
try:
calculated = int((y * Board.BoardWidth) + x)
# optionally, you may check if index is non-negative
if calculated < 0:
raise ValueError('Non-negative index expected, got ' +
repr(calculated))
return self.board[calculated]
# you may expect exception when converting to int
# or when index is out of bounds of your sequence
except (ValueError, IndexError) as err:
print('error in shapeAt:', err)
# handle special case here
# ...
# None will be returned here anyway, if you won't return anything
# this is just for readability:
return None
如果你是初学者,你可能会感到惊讶,但在Python中,负面索引是完全有效的,但它们具有特殊含义。您应该阅读它,并决定是否要在您的函数中允许它们(在我的示例中,它们是不允许的)。
您可能还想了解有关转换为int的规则:
https://docs.python.org/2/library/functions.html#int
考虑一下,如果对你来说,在尝试转换为int之前,用户地板或天花板会不会更好:
https://docs.python.org/2/library/math.html#math.floor
https://docs.python.org/2/library/math.html#math.ceil
请确保在调用之前有float
! ;)