1

次のような while ループがあります。

while a[xp][yp] - a[xp-1][yp] == 0  and a[xp][yp] - a[xp+1][yp] == 0 and a[xp][yp] - a[xp][yp-1] == 0 and a[xp][yp] - a[xp][yp+1] == 0:
    c=randint(0,3)
    if c==0:
        xp=xp+1; yp=yp
    elif c==1:
        xp=xp-1; yp=yp
    elif c==2:
        xp=xp; yp=yp+1
    else:
        xp=xp; yp=yp-1
    xp=xp; yp=yp

問題は、xp または yp = 0 または n (x 方向または y 方向の配列の長さ、正方行列) の場合、while ループの条件が破綻し、範囲外エラーが発生することです。xp=0 または xp=n または yp=0 または yp=n (これを行う別のコードがあります) の場合に新しい座標セットを取得し、while ループを再度実行したいだけです。

コードの性質は、約 4 回に 1 回の割合で、範囲外に出ずに実行されるようです。たまたま機能するまで実行し続ける必要があります。

4

1 に答える 1

1

次のように、操作がインデックスを範囲外にプッシュするかどうかを簡単に確認できます。

if c==0 and xp < len(a)-1:
  xp += 1
elif c==1 and xp > 0:
  xp -= 1
# etc...

これにより、後で確認するのではなく、実際に変更するxpにが範囲内にとどまります。


2番目の問題はwhileステートメントにあります. xpandypが配列の境界内にあることを確認したとしても、初期状態で外側をチェックしている可能性があります:

while a[xp][yp] - a[xp-1][yp] == 0 and a[xp][yp] - a[xp+1][yp] == 0  \ 
  and a[xp][yp] - a[xp][yp-1] == 0 and a[xp][yp] - a[xp][yp+1] == 0:

ここでaは、サイズが 10 x 10 (0 から 9 までのインデックス) であると仮定します。xp0 とyp9を設定すると、次のようになります。

while a[0][9] - a[-1][9] == 0 and a[0][9] - a[1][9] == 0 \
      a[0][9] - a[0][10] == 0 and a[0][9] - a[0][10]:

a[10]範囲外のエラーがスローされるため、インデックスが配列の境界上にある場合にループを変更する方法を決定する必要があります。a[9]それはまだ配列の有効なインデックスであることに注意してください-問題である次のインデックスをチェックしています。

余談ですが、実際には例外をスローしa[-1] ませんが、論理エラーである可能性があります。負のインデックスは配列の最後の要素にアクセスします


何をする必要があるかに依存しますが、それを修正する可能な方法: Python はoperatorを短絡するorので、例外をスローせずに次のように書くことができます:

while (xp <= len(a)-2 or a[xp][yp]-a[xp+1][yp] == 0) and \
      (xp > 1         or a[xp][yp]-a[xp-1][yp] == 0) and #etc...

ここで、if xpis less than len(a)-2(最初の句が true と評価される) の場合、ステートメントの残りの半分は評価されず、範囲外の例外は発生せず、ループは引き続き実行されます ( is がtrueorである限り)。 xp1 より大きい場合、ステートメントの残りの部分も true と評価されます)。

于 2013-02-20T17:06:09.447 に答える