FCC格子の座標の配列を作成するコードを開始します。ここに私のコードは便利print文で、これまでのところです:Python - 元の配列を変更すると、別のメモリ位置の変更
def init_FCC(a, x_rep,y_rep,z_rep):
n_atoms = 4*x_rep*y_rep*z_rep
UC = array([[0, 0, 0],[(a/2),(a/2),0],[(a/2), 0, (a/2)],[0,(a/2),(a/2)]])
coords = UC[:]
print(array_equal(coords,UC))
for n in range(x_rep):
if array_equal(coords,UC) == False:
coords = vstack((coords, UC))
UC[:,0] += a
print(UC,id(UC))
print(coords,id(coords),'\n',60*'*')
return(coords)
例A = 5、のために、機能を使用してx_rep = 3は、print文は、if文は、配列、すなわち真決してないことを示します " UCとcoordsは常に同じです。しかし、あなたが見ることができるように、if文の直後では、forループが繰り返されるたびに、UCの最初の列を変更しますが、coordsは変更しません。私はそれぞれのIDが異なるメモリの場所であることを確認しました。 UCの変更時に配列の座標が変化するのはなぜですか?これを防ぐにはどうすればよいですか?後で、これはおそらく、FCC格子を作成する最終目的を達成するための最良の方法ではないが、私自身のコードを作りたいと思っている。
ありがとうございました。あなたはちょうど同じオブジェクトの新しい「ラベル」を作成しているvarr_array2 = var_array1
を行う際
ここで 'coords'を' coords = vstack((coords、UC)) 'に再割り当てします。新しいメモリの場所です。 – Alexander
'array'、' array_equal'、 'v_stack'のどれも定義されていません。 –
array、array_equal、およびvstackはすべてnumpy関数です。私が質問に述べたように、if文は決してTrueではなく、vstack操作は決して実行されません。私は別の印刷ステートメントでこれを確認しましたが、それを含めないと謝罪します。 –