数组无法修复“局部变量'x'在赋值前被引用”

0 投票
1 回答
521 浏览
提问于 2025-04-18 18:16

为什么这段Python代码还是会报“局部变量在赋值前被引用”的错误呢?

class GameObject():
x=[0]
y=[0]
file = "images/initImage.jpg"
image = pygame.image.load('images/initImage.jpg')
def __init__(self,file):
    self.file=file
    image = pygame.image.load(file).convert()
    gameobjects.append(self)

def update(a):
    x[0]+=10

我原以为使用一个只有一个元素的数组可以解决这个问题。我也试过使用global和nonlocal这两个关键字,但也没用。抱歉如果这个问题已经有人问过,但我在其他问题中看到的解决办法似乎都不管用。

1 个回答

0

你其实不需要使用 Python 列表,Python 本身并没有数组的概念:

下面这段代码使用了实例属性,这是 @user2864740 提出的建议。

我假设 gameobjects 是一个全局变量?如果是这样的话,代码是可以工作的,但设计上并不是很好——理想情况下,一个类应该是自给自足的。更好的设计是让调用者先创建一个 GameObject,然后再把它添加到 gameobjects 列表中,作为第二步。

class GameObject():
    def __init__(self,file):
        self.x, self.y = 0 
        self.file= "images/initImage.jpg"
        self.image = pygame.image.load(file).convert()
        gameobjects.append(self)

    def update(self, a):
        self.x+=10

你会注意到我把 "update" 变成了一个真正的实例方法——我觉得这样是对的,虽然你传入的 "a" 参数的用途不太清楚,所以我还是保留了它。

注意:将来如果你遇到 “local variable 'x' referenced before assignment” 的错误,不要自动尝试通过把你的变量转换成列表来解决。虽然在某些情况下那可能是正确的解决方案,但你需要看看你是在哪里使用这个变量的:错误信息实际上是在说你在表达式/语句的右侧使用了这个变量,但在左侧使用之前没有给它赋值——也就是说,你试图在给变量赋值之前使用它的值。解决方案几乎总是:

  • 你的变量没有被初始化
  • 作用域问题——你已经初始化了变量,但不是在你尝试使用它的同一个作用域内:这就是你最初的问题(x 被初始化为类属性,但你试图把它当作全局变量使用)。

可能还有其他原因(我现在想不起来了),但这两种是最常见的。

撰写回答