gpt4 book ai didi

python - 通过更改某些元素从另一个列表分配值来附加列表

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:07 25 4
gpt4 key购买 nike

我有一个列表,我想通过丢弃一些元素并更改一些元素来从此列表构造另一个列表。我正在执行以下操作:

gridAtoms = someFunction() # a list of lists. gridAtoms[i][6] is [float,float,float]
occ = someOtherFunction() # a 3D numpy array

occGridAtoms = []
selectedOcc = []
for i, atom in enumerate(gridAtoms):
coord = np.array(atom[6])
x = int(round(b1.dot(coord) / spacing[0]))
y = int(round(b2.dot(coord) / spacing[1]))
z = int(round(b3.dot(coord) / spacing[2]))
selectedOcc.append(occ[x, y, z])
currentAtom = list(atom)
currentAtom[7][0] = occ[x, y, z]
if occ[x, y, z] >= 0.01:
occGridAtoms.append(list(currentAtom))

问题是,即使我执行 currentAtom = list(atom) 而不仅仅是 currentAtom =atomgridAtom 的元素,具体来说,gridAtom[i][7][0] 发生变化。即使我使用 list() 创建新列表,为什么会发生这种情况?我怎样才能保持gridAtoms不变?

最佳答案

正在做list(<another list>)只是对列表进行浅拷贝,而不是深层复制,因此如果列表本身包含可变对象,则这些对象是通过引用复制的,即新列表将包含相同的引用,并且这些可变对象内的任何更改都会反射(reflect)跨列表。

显示此行为的示例 -

>>> l = [[1,2],[3,4]]
>>> newl = list(l)
>>> newl[0][1] = 5
>>> l
[[1, 5], [3, 4]]

您真正想做的是深层复制,在这种情况下您应该使用, copy.deepcopy() ,示例-

import copy
currentAtom = copy.deepcopy(atom)

示例/演示 -

>>> l = [[1,2],[3,4]]
>>> import copy
>>> newl = copy.deepcopy(l)
>>> newl[0][1] = 5
>>> l
[[1, 2], [3, 4]]

关于python - 通过更改某些元素从另一个列表分配值来附加列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32146734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com