2

我一直有错误

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)的向量,所有大写的变量都是常数(数字)。有人知道如何解决这个问题吗?我在互联网上找到了许多可能的解决方案,但似乎没有任何效果..

4

3 回答 3

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
于 2013-03-19T18:10:56.673 回答
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.
于 2013-03-19T18:10:40.147 回答
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

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

  1. 如果 pos < WALL,则返回 WALL_FORCE
  2. 否则,如果 pos > WIDTH - WALL,则返回 -WALL_FORCE
  3. 否则,返回速度

这是关于三元运算符的一般问题。记住,想,“它被一些 pythonistas 所反对。”

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

返回您的原始文件并修复错字yvelocity以防万一:bposx > WIDTH - WALLyvelocity不依赖xpos于.

于 2013-03-19T18:27:07.270 回答