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



我一直有错误

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)的向量,所有大写的变量都是常量(数字)。有人知道怎么解决这个问题吗?我在网上找到了许多可能的解决方案,但似乎都不起作用。

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

如果这两个条件都不为真会发生什么?

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.

说明

正如其他人指出的那样,您不是在处理WALL <= pos <= WIDTH - WALL

<标题>建议改变h1> 果物体没有撞到墙壁,那么它可能会继续保持当前的速度。还有一些代码在物体没有撞墙的情况下将速度设置为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. return WALL_FORCE if pos <墙>
  2. 如果pos> WIDTH -WALL ,则返回- wall_force
  3. 否则,返回速度

这是一个关于三元运算符的一般问题。记住,我想,"有些pythonistas不喜欢它。"

如果你不使用这个代码…

返回到您的原始并修复在yvelocity情况下的错字:bposx > WIDTH - WALLyvelocity不依赖于xpos

相关内容

  • 没有找到相关文章

最新更新