每次运行此程序时,都会出现以下错误:
ValueError: list.remove(x): x not in list
我正试图降低一个外星生命,每当它被击中一个螺栓。如果这个外星人的健康状况是<= 0
,它也应该被摧毁。同样,螺栓也会被破坏。这是我的代码:
def manage_collide(bolts, aliens):
# Check if a bolt collides with any alien(s)
for b in bolts:
for a in aliens:
if b['rect'].colliderect(a['rect']):
for a in aliens:
a['health'] -= 1
bolts.remove(b)
if a['health'] == 0:
aliens.remove(a)
# Return bolts, aliens dictionaries
return bolts, aliens
ValueError
发生在aliens.remove(a)
行上。为了澄清,这两个词都是字典列表。
我做错什么了?
不应从循环的列表中删除项。改为创建副本:
以及
在列表上循环时修改列表会影响循环:
从循环两次的列表中删除项会使事情更加复杂,从而导致值错误:
在循环的每个级别创建要修改的列表副本时,可以避免以下问题:
当你发生碰撞时,你只需要移除一次螺栓,而不是在伤害外星人的回路中。以后把外星人分开清理:
你的代码中有一个错误导致了这种情况。简化后的代码看起来像:
这导致您对
b
中的每个条目循环aliens
多次。如果b在第一个循环中被删除,那么当它第二次循环时,就会出现错误。有几件事要解决。首先,改变
aliens
上的内部循环以使用a
以外的内容,因此:第二,只从
bolts
中删除b
一次。所以:我认为这段代码也有其他问题,但这是导致您的主要问题的原因。马蒂金的职位也可能有帮助。
给螺栓一个“健康”,初始化为1。然后你可以做一个嵌套循环来计算所有的伤害,两个独立的不受尊重的“循环”来移除所有的“死亡”。但是,不要这样做,因为你仍然不想修改你正在循环的列表。复制仍然太复杂。您真正想做的是直接构建一个新的列表,其中只包含仍然“活动”的东西,您可以用列表理解(或者如图所示,用
filter
)描述地完成这项工作。相关问题 更多 >
编程相关推荐