当我改变原始数组时,单独内存位置的Python数组会改变

2024-06-06 18:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始编写一个代码来创建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晶格,但我想让我自己的代码。你知道吗

谢谢。你知道吗


Tags: 代码idforifdef数组equal语句
2条回答

当您执行varr_array2 = var_array1操作时,您只是在为同一对象创建一个新的“标签”,请参见以下示例:

a = np.array([[0,0,0],[1,1,1], [2,2,2], [3,3,3]])
b = a

print (a is b)
True

c = a.copy()
print (a is c)
False

b[0] = [0,0,0]
print (a)
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]

c[0] = [9,9,9]
print (a)
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]

print(c)
[[9 9 9]
 [1 1 1]
 [2 2 2]
 [3 3 3]]

结论:使用array.copy()。你知道吗

coords = UC[:]在数组上提供了一个可选的视图,而不是它的副本。你需要coords = UC.copy()。你知道吗

相关问题 更多 >