4

こんにちは、初心者の質問で申し訳ありませんが、私はpythonを使用しており、配列をコピーするという問題がありますが、コピーを変更すると元に影響します。境界行列から一連の座標に線形オフセットを追加したい:

boundaries = [[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]]

xyzCoord = [[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ...

extraX=[]
for i in range(0,len(xyzCoord)):
    toAdd=[]
    toAdd=xyzCoord[i]
    toAdd[0]=toAdd[0]+boundaries[0][0]

print xyzCoord

私が期待する出力は、複製 (toAdd) を作成してから変更するため、xyzCoord が影響を受けないことです。不思議なことに、このループは私の xyzCoord に影響を与えます:

出力は次のとおりです。

[[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]]

[[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ...

[[5.818, 0.0, 0.0], [8.727, 2.909, 0.0], ...

編集:コンテキストについては、転置された値を使用して最終的に別のリストを作成し、最終的に挿入されたリストを作成したいという考えですが、この部分が私を支えています。つまり、理想的には [[0.0, 0.0, 0.0], [5.818, 0.0, 0.0], [2.909, 0.0, 0.0], [8.727, 2.909, 0.0]...] を作成してから、より大きなループを作成します。 Y と Z の場合。この方法で、XY と Z の座標を任意の回数伝播できます。

4

3 に答える 3

9

これは、Python に関する最も驚くべきことの 1 つです。=オペレーターは、何もコピーしません。既存のオブジェクトに新しい名前を付けるだけです。

リストのコピーを作成したい場合は、リストのスライスを使用できます。スライシング オペレータコピーを作成します。

toAdd=xyzCoord[i][:]

モジュールからcopyまたはを使用して、オブジェクトのコピーを作成することもできます。deepcopycopy

于 2013-04-01T15:42:19.200 に答える
1

toAdd重複ではありません。以下はtoAddと同じサブリストを参照しますxyzCoord[i]:

toAdd = xyzCoord[i]

の要素を変更するtoAddと、対応する の要素xyzCoord[i]も変更されます。

上記の代わりに、次のように記述します。

toAdd = xyzCoord[i][:]

これにより、(浅い) コピーが作成されます。

于 2013-04-01T15:36:28.640 に答える