2012-03-05 5 views
3

Я не понимаю, что случилось. Я отправлю часть кода, которая уместна.python - TypeError: индексы кортежа должны быть целыми числами

Error:

Traceback (most recent call last): 
    File "C:\Python\pygame\hygy.py", line 104, in <module> 
    check_action() 
    File "C:\Python\pygame\hygy.py", line 71, in check_action 
    check_portal() 
    File "C:\Python\pygame\hygy.py", line 75, in check_portal 
    if [actor.x - 16, actor.y - 16] > portal[i][0] and [actor.x + 16, actor.y + 16] < portal[i][0]: 
TypeError: tuple indices must be integers 

функция:

def check_portal(): 
    for i in portal: 
     if [actor.x - 16, actor.y - 16] > portal[i][0] and [actor.x + 16, actor.y + 16] < portal[i][0]: 
      if in_portal == False: 
       actor.x,actor.y=portal[i][1] 
       in_portal = True 
     elif [actor.x - 16, actor.y - 16] > portal[i][1] and [actor.x + 16, actor.y + 16] < portal[i][1]: 
      if in_portal == False: 
       actor.x,actor.y=portal[i][1] 
       in_portal = True 
     else: 
      in_portal = False 

инициализации актер:

class xy: 
    def __init__(self): 
    self.x = 0 
    self.y = 0 
actor = xy() 

инициализация портала:

portal = [[100,100],[200,200]],[[300,300],[200,100]] 

ответ

1

Учитывая инициализацию portal, цикл

for i in portal: 
    ... 

будет делать только две итерации. На первой итерации i будет [[100,100],[200,200]]. Попытка сделать portal[i] будет эквивалентна portal[[[100,100],[200,200]]], и это не имеет смысла. Вы, вероятно, просто хотите использовать i вместо portal[i]. (Вы, вероятно, хотите, чтобы переименовать его в нечто более значимое, чем i, тоже.)

1

Когда вы сказали for i in portal, в каждой итерации, вместо индексов в portal, которые вы можете думать, i на самом деле элементы portal. Поэтому он не является целым числом и вызывает ошибку в portal[i][0].

Так быстро исправить это просто заменить, что for i in xrange(len(portal)), в котором i является индексом.

0

Внутри цикла for, i = ([100, 100], [200, 200]), что является недопустимым индексом для списка.

Учитывая сравнения в случае заявления, похоже, ваше намерение было больше похоже:

for coords in portal: 
    if [actor.x - 16, actor.y - 16] > coords[0] and [actor.x + 16, actor.y + 16] < coords[0]: 

где coords[0] == [100, 100] на первой итерации цикла.