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

推奨される変更

おそらく、ボイドは壁にぶつからない限り、現在の速度を維持します。他には、ボイドが壁にぶつかっていない場合に速度を 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 - WALL。はyvelocityに依存しませんxpos

于 2013-03-19T18:27:07.270 に答える