Python:在赋值错误之前引用的局部变量

时间:2013-03-19 18:06:32

标签: python boids

我一直有错误

  

UnboundLocalError:之前引用的局部变量'new_speedDx'   分配

尝试运行以下功能时

def new_speedD(boid1):
    bposx = boid1[0]
    if bposx < WALL:
        new_speedDx = WALL_FORCE
    elif bposx > WIDTH - WALL:
        new_speedDx = -WALL_FORCE

    bposy = boid1[1]
    if bposy < WALL:
        new_speedDy = WALL_FORCE
    elif bposx > WIDTH - WALL:
        new_speedDy = -WALL_FORCE

    return new_speedDx, new_speedDy

在这个函数中,boid1是一个包含4个元素的向量(xpos,ypos,xvelocity,yvelocity),所有大写的变量都是常量(数字)。 有人知道如何解决这个问题?我在互联网上找到了许多可能的解决方案,但似乎没有任何效果......

3 个答案:

答案 0 :(得分:5)

bposx必须可能既不低于WALL也不高于WIDTH - WALL。

例如:

bposx = 10
WALL = 9
WIDTH = 200

if bposx < WALL:    # 10 is greater than 9, does not define new_speedDx 
    new_speedDx = WALL_FORCE
elif bposx > WIDTH - WALL:   # 10 is less than (200 - 9), does not define new_speedDx
    new_speedDx = -WALL_FORCE

如果没有看到你的程序的其余部分,很难建议一个合理的回退值,但你可能想要添加如下内容:

else:
    new_speedDx = 0

答案 1 :(得分:4)

如果这些条件都不成立,会发生什么?

if bposx < WALL:
    new_speedDx = WALL_FORCE
elif bposx > WIDTH - WALL:
    new_speedDx = -WALL_FORCE

... new_speedDx永远不会被分配,因此它的价值是不确定的。

您可以通过指定new_speedDx在这种情况下应该包含的内容来缓解此问题:

if bposx < WALL:
    new_speedDx = WALL_FORCE
elif bposx > WIDTH - WALL:
    new_speedDx = -WALL_FORCE
else:
    new_speedDx = 0.

答案 2 :(得分:2)

解释

正如其他人所指出的那样,你并没有处理WALL <= pos <= WIDTH - WALL

的情况

建议的更改

如果没有撞到墙壁,大概是当前的速度继续。其他人有代码,如果boid没有碰到墙壁,则将速度设置为0。该解决方案在使用现有速度方面是独特的。我认为这对你的情况很重要。

代码

def new_speedD(boid1):
    def new_speed(pos, velocity):
        return WALL_FORCE if pos < WALL \
            else (-WALL_FORCE if pos > WIDTH - WALL \
            else velocity)
    xpos, ypos, xvelocity, yvelocity = boid1
    new_speedDx = new_speed(posx, xvelocity)
    new_speedDy = new_speed(posy, yvelocity)
    return new_speedDx, new_speedDy

有些人认为这段代码很难理解。这是一个简短的解释:

    如果pos&lt;
  1. 返回WALL_FORCE WALL
  2. 否则,如果pos&gt;返回-WALL_FORCE WIDTH - WALL
  3. 否则,返回速度
  4. 这是general question on the ternary operator。记住,想一想,“这是一些蟒蛇人的不满。”

    如果您不使用此代码......

    返回原文并修复yvelocity案例中的拼写错误:bposx > WIDTH - WALLyvelocity不依赖于xpos