遍历字典移除饥饿死亡Fox对象时运行时错误的解决方法
问题分析与修复方案
核心问题
- 方法嵌套错误:
Main方法被错误缩进在Simulation类的__init__方法内部,导致无法被正常调用。 - 字典迭代时修改结构:遍历
self.Foxes.keys()的同时调用pop(i)删除元素,会触发RuntimeError——字典在迭代过程中不允许修改其大小。 - 变量名冲突:外层循环(模拟步骤)和内层循环(遍历狐狸)使用了相同的变量名
i,导致变量被覆盖,逻辑混乱。
修复后的代码
import random class Simulation: def __init__(self): self.Foxes = {} for i in range(100): # 创建100只狐狸 self.Foxes[i] = Fox() def Main(self): # 模拟100次觅食循环 for step in range(100): # 遍历字典键的副本,避免迭代时修改原字典引发错误 for fox_id in list(self.Foxes.keys()): fox = self.Foxes[fox_id] fox.Forage() if fox.Hunger >= fox.HungerMaximum: self.Foxes.pop(fox_id) print(f"剩余狐狸数量:{len(self.Foxes)}") class Animal: def __init__(self): self.Age = 0 self.HungerMaximum = 50 self.Hunger = 0 self.ForagingChance = 20 def Forage(self): if random.randint(1, self.ForagingChance) == self.ForagingChance: if self.Hunger > 10: self.Hunger -= 10 else: self.Hunger += 10 class Fox(Animal): def __init__(self): super().__init__() # 用super()替代直接调用父类构造,更符合Python规范
关键修复说明
- 修正方法缩进:将
Main方法的缩进调整为与__init__同级,确保它是Simulation类的成员方法。 - 避免迭代时修改字典:使用
list(self.Foxes.keys())创建键的副本进行遍历,这样即使原字典删除元素,迭代过程不受影响。 - 解决变量名冲突:将外层循环变量改为
step,避免和内层的狐狸ID变量fox_id混淆。 - 优化父类初始化:用
super().__init__()替代Animal.__init__(self),让代码更易维护,尤其是在多继承场景下。
内容的提问来源于stack exchange,提问作者pmztls
相关产品推荐
相关产品推荐

