0

私は次の行動に完全に当惑しています:

  gap_in_y[i][j] = max((scoreMatrix[i-1][j] - dy), (gap_in_y[i-1][j] - ey))
  if i == 3 and j == 1:
    print gap_in_y
  gap_in_x[i][j] = max((scoreMatrix[i][j-1] - dx), (gap_in_x[i][j-1] - ex))
  if i == 3 and j == 1:
    print gap_in_y

2 つの print ステートメントは、厳密に 1 つの値 ( に含まれる値) が異なる配列を生成しますgap_in_y[3][1]。別の配列である を変更gap_in_xしても、影響はありませんgap_in_y... しかし、どういうわけか影響があります。

何か案は?私はこれを理解しようとして夢中になっています!

次の方法で 2 つの配列を作成しました。

for i in range (0, ALength+1):
    for j in range (0, BLength+1):
        new.append("N/A")
    gap_in_y.append(new)
    gap_in_x.append(new)
    new = []
4

5 に答える 5

2

gap_in_yとがどのように作成されたかを見ずに判断するのは難しいですgap_in_xが、おそらくここで起こっていることは、gap_in_y[3]gap_in_x[3]が両方とも同じリストへの参照であるため、一方を変更すると他方も変更されるということです。これは、次のコードを追加することで確認できます。

if i == 3:
    print id(gap_in_y[3]) == id(gap_in_x[3])

これが出力された場合True、ネストされたリストの両方に同じリストのコピーがあることがわかります。

于 2012-10-01T23:56:13.760 に答える
0

あなたがするとき:

gap_in_x.append(new)
gap_in_y.append(new)

両方のリストが同じオブジェクトを参照しますnew

最も簡単な解決策は、これを次のように変更することです。

gap_in_x.append(new[:])
gap_in_y.append(new[:])

(リストであると仮定しnewます)。

slice オペレーター[:]は list のコピーを作成するnewため、各リストは独自のコピーを受け取ります。

于 2012-10-02T00:40:02.853 に答える
0

他の回答は、現在のコードの問題を指摘しています。明示的なループとではなく、リスト乗算とリスト内包表記を使用して、リストを作成する別の方法を提案したいだけですappend()

gap_in_x = [["N/A"] * (BLength + 1) for _ in range(ALength + 1)]
gap_in_y = [["N/A"] * (BLength + 1) for _ in range(ALength + 1)]

外側のリストにリストの乗算を使用したくないことに注意してください(例[["N/A"] * BLength] * ALength:今回は外側の配列であり、2 つにまたがるわけではありません)。文字列は不変であるため、内側のリストには問題ありません。の一部 (またはすべて) がN/A同じオブジェクトを参照しているかどうかは問題ではありません。そのオブジェクトは変更できないためです。

于 2012-10-02T03:37:46.397 に答える
0

なるほど、配列を作成したときに、単一の新しいリストを作成し、この同じリストをgap_in_xgap_in_yリストの両方に追加します。したがって、それらには同じリストが含まれるようになり、その中の突然変異は当然、どちらかの親リストから見られます。

于 2012-10-02T00:42:40.590 に答える
0

new を追加する代わりに、new[:] を追加します。これにより、gap_in_* ごとに new のコピーが作成されます。現在のように、同じリストがそれぞれに配置されます。

for i in range (0, ALength+1):
    for j in range (0, BLength+1):
        new.append("N/A")
    gap_in_y.append(new[:])
    gap_in_x.append(new[:])
    new = []
于 2012-10-02T03:18:53.103 に答える