2

私はPython(およびプログラミング全体)の初心者です。これに対する答えは明らかだと確信していますが、何をすべきか本当にわかりません。

def do_play(value, slot, board):
    temp=board
    (i,j) = slot
    temp[i][j] = value
    return temp

ボードはリストのリストです。値は整数です。スロットは整数タプルです。

私がここでやろうとしていることは、

  • 機能ボードにフィード
  • board を temp という新しいリストにコピーします
  • temp の特定の場所に新しい値を挿入する
  • 温度を戻し、ボードを変更せずに

これをシェルで実行すると、元のリスト (ボード) と新しいリスト (一時) の両方が変更されます。= \

どんな助けでも大歓迎です。

4

5 に答える 5

10

temp=board新しいボードを作成しません。変数参照をtempとまったく同じリストにしboardます。だから変わることもtemp[i][j]変わるboard[i][j]

コピーを作成するには、

import copy
temp=copy.deepcopy(board)

temp=board[:]make は新しいリストを参照することに注意してtempください ( とは異なりますboardが、内容 (つまり、リスト内のリスト) は同じです)。

In [158]: board=[[1,2],[3,4]]    
In [159]: temp=board[:]    

変更すると以下もtemp変更されboardます:

In [161]: temp[1][0]=100    
In [162]: temp
Out[162]: [[1, 2], [100, 4]]    
In [163]: board
Out[163]: [[1, 2], [100, 4]]

idオブジェクトのメモリ アドレスを示します。これはtempboard異なるリストを示しています。

In [172]: id(temp)
Out[172]: 176446508

In [173]: id(board)
Out[173]: 178068780   # The ids don't match

しかし、これは内部の2番目のリストが内部tempのリストとまったく同じであることを示していますboard:

In [174]: id(temp[1])
Out[174]: 178827948

In [175]: id(board[1])
Out[175]: 178827948    # The ids are the same

ただし、 を使用するcopy.deepcopyと、リスト内のリストもコピーされます。これは、変更tempが変更されていない場合に必要なものですboard

In [164]: import copy    
In [165]: board=[[1,2],[3,4]]    
In [166]: temp=copy.deepcopy(board)    
In [167]: temp[1][0]=100    
In [168]: temp
Out[168]: [[1, 2], [100, 4]]    
In [169]: board
Out[169]: [[1, 2], [3, 4]]
于 2010-10-19T02:49:21.403 に答える
5

コピーしようとしていますboardか?

temp = board[:]

または、これで構造をコピーすることもできます。

temp = [ r[:] for r in board ]
于 2010-10-19T02:48:59.797 に答える
2

copy.deepcopy()オブジェクトをコピーするために使用します。

于 2010-10-19T02:48:31.900 に答える
2

これは、浅いコピーであるtempへの参照です。board私は通常、コピー モジュール ( import copy)をインポートして、ボードcopy.deepcopyとはtemp別のものを使用するのが好きです。あなたはそれを次のように呼びます:

import copy
temp = copy.deepcopy(board)

それ以外の場合は、ボードのスライスを作成するだけです (これにより、ディープ コピーも作成されます)。これはうまくいくと思いますが、リストのリストで試したことはありません。あなたはそれを次のように呼びます:

temp = board[:]
于 2010-10-19T02:51:03.733 に答える
0
temp=board

これはリストをコピーするのではなく、同じオブジェクトへの参照をもう 1 つ作成するだけです。temp = board[:]代わりに使用してください。

于 2010-10-19T02:50:27.930 に答える