Python NeuroEvolutionProject: ValueError: list.remove(x): x not in list (when x is, in fact, in the list)

Python NeuroEvolutionProject: ValueError: list.remove(x): x not in list (when x is, in fact, in the list)

我正在从事一个神经进化项目,其中有一个充满活动实体和死亡实体的数组。当活动实体死亡时,它们将从活动列表中删除并放入死亡列表中。从活动列表中删除实体时,我经常遇到此错误:ValueError:

ValueError: list.remove(x): x not in list

请注意,这些列表在执行过程中会被填充和清空数百次。此代码在每一帧期间都是 运行,因此这些列表在每次执行期间循环了数千次。并不是每一代都会抛出这个错误。它似乎在执行过程中的不同点随机发生。

代码示例:

for entity in self.active:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        self.dead.append(entity)
        self.active.remove(entity)

如果我可以提供任何其他信息,请询问:)

改变您正在迭代的列表是灾难的根源。考虑以下简单情况:

entities = [1,2,3,4,5]
for entity in entities:
    entities.remove(entity)

您会期望每个实体都应该被删除。但是,如果您在 运行 上面的代码之后检查 entities 列表:

print(entities)

[2, 4]

显然不是预期的结果。

我将从重构您的代码开始,这样您就不会在 for entity in self.active 循环中改变 self.active。也许存储要删除的项目的临时列表,然后在退出 for entity in self.active: 循环后将它们全部删除:

to_remove = []
for entity in self.active:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        to_remove.append(entity)
for entity in to_remove:
    self.active.remove(entity)

或者您可以 运行 for entity in self.active[:]: 创建列表的浅表副本以迭代:

for entity in self.active[:]:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        self.dead.append(entity)
        self.active.remove(entity)

您可能应该分析这些不同的选项,看看哪个更适合您的情况。

从提供的代码中,我无法确切地看出您的错误是如何产生的。但是有很多您没有提供的代码可能会有所贡献(即 #bla bla bla unimportant)。我怀疑您的问题可能出在我上面概述的内容上。