Python在分配之前提到的变量是在for循环中分配的吗?

时间:2017-11-16 20:18:25

标签: python

编辑
我很擅长删除我正在循环播放的内容。谢谢你们。

我已经尝试过查找答案但老实说这只是令我难以置信 我有一个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

我只是不知道我做错了什么。

1 个答案:

答案 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]