我一直有错误
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
。
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
有些人认为这段代码很难理解。下面是一个简短的解释:
- return WALL_FORCE if pos <墙>墙> 如果pos> WIDTH -WALL ,则返回- wall_force
- 否则,返回速度
这是一个关于三元运算符的一般问题。记住,我想,"有些pythonistas不喜欢它。"
如果你不使用这个代码…
返回到您的原始并修复在yvelocity
情况下的错字:bposx > WIDTH - WALL
。yvelocity
不依赖于xpos