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
)。我怀疑您的问题可能出在我上面概述的内容上。
我正在从事一个神经进化项目,其中有一个充满活动实体和死亡实体的数组。当活动实体死亡时,它们将从活动列表中删除并放入死亡列表中。从活动列表中删除实体时,我经常遇到此错误: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
)。我怀疑您的问题可能出在我上面概述的内容上。