首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError: 0x0000024699C2C670>处的<__main__.projectile对象不在列表中

ValueError: 0x0000024699C2C670>处的<__main__.projectile对象不在列表中
EN

Stack Overflow用户
提问于 2021-06-27 23:58:22
回答 1查看 31关注 0票数 0

我一直在尝试用PyGame创建一个游戏,但有时会因为这个错误而崩溃:

代码语言:javascript
复制
ValueError: <main.projectile object at 0x0000024699C2C670> is not in list

您是否知道任何可能的修复方法?

正如我从其他人那里看到的,可能是我在迭代的同时修改了项目符号列表,但我找不到解决方案,甚至在阅读这个线程时也找不到解决方案。

PS。我知道我可以使用一个函数来生成小精灵,而不仅仅是复制和粘贴,但这是一个我试图克服的快速项目。代码如下:

代码语言:javascript
复制
def enemy():
       def __init__(self, x, y, width, height, end):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x, self.end]
        self.walkCount = 0
        self.vel = 3
        self.hitbox = (self.x + 17, self.y + 2, 31, 57)
        self.health = 10
        self.visible = True

bullets = []
goblin = enemy(100, 410, 64, 64, 450)

# mainloop
while run:
 if not goblin.visible:
      goblin.hitbox = 0
      for bullet in bullets:
          if 0 < bullet.x < 500:
              bullet.x += bullet.vel
           else:
                if len(bullets) != 0:
                   bullets.pop(bullets.index(bullet))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-28 16:23:33

这里的问题似乎是,您迭代了for循环中的项目符号,并在中途删除了一个项目符号。下面这行

代码语言:javascript
复制
for bullet in bullets:

在实践中,将通过index从第一个项目符号到最后一个项目符号逐一进行检查。也就是说,如果您的列表是bullets = [bullet1, bullet2, bullet3],它将针对bullets[0]执行,然后针对bullets[1]执行,最后针对bullets[2]执行。当您从列表中删除项目符号时,此处会出现问题。假设在循环中删除了bullet2 (即bullets[1] )。现在索引仍将跳转到2,并且将访问bullets[2]。但是,现在只有两个项目符号bullets = [bullet1, bullet3],并且出现错误。

另一方面,如果bullet1被移除,bullets现在就是bullets = [bullet2, bullet3]了。循环继续到索引1,但这完全跳过了bullet2

在许多编程语言中,这是一个非常常见的问题。在许多语言中,从最后一项到第一项迭代列表可以解决这个问题,但在python中这并不简单。

看看this StackOverflow answer,更好地了解你的选择。

一种解决方案

解决这个问题的一种方法不是最有效的,但相对容易理解的是,在评估项目的同时,构建一个新的项目列表。您将添加保留在新项目列表中的所有项目符号,而不是删除项目符号。

代码语言:javascript
复制
newBullets = []
for bullet in bullets:
          if 0 < bullet.x < 500:
              bullet.x += bullet.vel
              # append bullet to keep it
              newBullets.append(bullet)
          # else don't do anything
# after the loop, update the bullets list
# which now contains only bullets that have an x between 0 and 500
bullets = newBullets
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68152947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档