IndexError:pop索引超出范围(python)3

时间:2017-02-02 22:25:23

标签: python range

arrows=[]
badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=196

index=1

for badguy in badguys:
    if badguy[0]<-64:
        badguys.pop(index)
    badguy[0]-=7
    index+=1
for badguy in badguys:
    screen.blit(badguyimg, badguy)
# 6.3.1 - Attack castle
    badrect=pygame.Rect(badguyimg.get_rect())
    badrect.top=badguy[1]
    badrect.left=badguy[0]
    if badrect.left<64:
        healthvalue -= random.randint(5,20)
        badguys.pop(index)

给我错误:

Traceback (most recent call last):
  File "C:\Users\Thinkpad\Desktop\BB_Resources\game.py", line 80, in <module>
    badguys.pop(index)
IndexError: pop index out of range

2 个答案:

答案 0 :(得分:1)

你最初的问题正是M. Fabre所说的:你的循环索引在第一个循环中是有效的,但不是第二个循环。要解决这个问题,只需在每个循环之前设置 index = 0 (请记住Python在0处开始索引)。

但是,您的循环中存在更深层次的问题:在您对列表进行迭代时更改 badguys 会对您造成伤害。一段时间尝试这个测试:

badguys = [0, 1, 2, 3, 4, 5, 6, 7]
for i in badguys:
    print "Before:", i, badguys
    badguys.pop(i)
    print "After: ", i, badguys

对于您的代码所做的事情,这是MCVE。您需要更改您的工作,以便在运行时保持原始列表的完整性。相信我,你的程序没有足够的生命值来使一个&#34;指数超出范围&#34;重击。 : - )

我推断逻辑是这样的:

  1. 移除任何跑过城堡的坏人(位置&lt; -64)。
  2. 对于刚刚抵达城堡的任何坏人,要做5到20马力的伤害并移除那个坏人。
  3. 我建议两次通过:一次造成伤害(使用作为横向位置的表达式)

    if abs(left) <= 64:
        # do damage
        healthvalue -= random.randint(5,20)
        # mark for deletion
        left = -999
    

    ......还有第二个制作新的坏人名单。再次浏览列表,只保留仍然在比赛场地的列表:

    badguys = [badguy if badguy.left > -64 for badguy in badguys]
    

    现在这会让你摆脱困境吗?

答案 1 :(得分:0)

摆脱这一行:

index+=1

它应该可以工作