我开始编写一个代码来创建FCC晶格的坐标数组。以下是我迄今为止的代码,以及有用的打印语句:
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语句从不为True,即数组“UC”和“coords”总是相同的。但是您可以看到,在if语句之后,每次for循环迭代时,我都会直接更改UC的第一列,而不是coords。我检查了每个的id以确保它们是不同的内存位置。当我改变UC时,为什么数组坐标会改变,如何防止这种情况?作为一个事后说明,我知道这可能不是最好的方式来实现我的最终目标,创建一个FCC晶格,但我想让我自己的代码。你知道吗
谢谢。你知道吗
当您执行
varr_array2 = var_array1
操作时,您只是在为同一对象创建一个新的“标签”,请参见以下示例:结论:使用
array.copy()
。你知道吗coords = UC[:]
在数组上提供了一个可选的视图,而不是它的副本。你需要coords = UC.copy()
。你知道吗相关问题 更多 >
编程相关推荐