Skip to main content
 首页 » 编程设计

Python 在嵌套的 for 循环中赋值时说赋值前提到的变量

2025年05月04日22bjzhanghao

编辑
好吧,我是个白痴,因为我删除了循环播放的内容。谢谢大家。


我已经尝试查找答案,但老实说这让我感到困惑。
我有一个 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]。