编辑
我很擅长删除我正在循环播放的内容。谢谢你们。
我已经尝试过查找答案但老实说这只是令我难以置信 我有一个for循环,循环遍历列表中的列表,但是然后在嵌套到for循环的if语句中,它说它循环的东西没有定义?
for monster in self.monsters:
print("google chrome")
if monster[1][1] <= 0:
self.exp_gotten += monster[1][8]
for j in self.turns:
if j[0] == monster[1][0]:
del j
self.defeated_monsters.append(monster)
del monster
self.monsters是一个包含怪物其他列表的列表。这些列表就像[“Monster Name”,[monster_id,hp,mp,...]]。 Monster [1] [1]是HP stat,它会检查它是否小于0,表示它被击败了。然后它添加exp,然后从转弯列表中删除怪物,将其添加到失败的怪物列表中,然后删除怪物本身。
除了涉及到这一部分,我不断获得“怪物变量之前参考”分配“
File "C:\Users\Admin\Documents\Dave's stuff\Python\COURSEWORK\battle.py", line 150, in check_if_fin
if j[0] == monster[1][0]:
UnboundLocalError: local variable 'monster' referenced before assignment
我只是不知道我做错了什么。
答案 0 :(得分:5)
您的内部for
循环删除monster
变量:
for j in self.turns:
if j[0] == monster[1][0]:
del j
self.defeated_monsters.append(monster)
del monster
^^^^^^^^^^^
如果self.turns
包含多个元素且除最后一个元素之外的任何内容都进入if
块,您将删除monster
并获取该错误。你可能想要抛出一个break
语句,否则如果你已经完成就退出循环。
从您当前正在迭代的列表中删除对象很棘手。一种解决方案是使用中间列表:
new_monsters = []
for monster in self.monsters:
# It's usually clearer to remove unnecessarily nested `if` statements
if monster[1][1] > 0:
continue
self.exp_gotten += monster[1][8]
for j in self.turns:
if j[0] == monster[1][0]:
self.defeated_monsters.append(monster)
break # Don't continue checking, you've already defeated the monster
else:
# We never broke out of the above loop, so we never defeated the monster
new_monsters.append(monster)
self.monsters = new_monsters
最后,像monster[1][8]
和monster[1][1]
这样的代码真的很难管理。考虑将您的怪物设置为具有描述性属性的类,或者至少为namedtuple
。这样,您就可以使用monster.exp
代替monster[1][8]
。