编辑
好吧,我是个白痴,因为我删除了循环播放的内容。谢谢大家。
我已经尝试查找答案,但老实说这让我感到困惑。
我有一个 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
我只是不明白我做错了什么。
请您参考如下方法:
您的内部 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 block ,您将删除 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]。
