我有一个列表,我想通过丢弃一些元素和更改一些元素来构建此列表中的另一个列表。我正在做以下事情:
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 = atom
,gridAtom
的元素,特别是gridAtom[i][7][0]
的元素也会发生变化。即使我使用list()
创建新列表,为什么会发生这种情况?我怎样才能保持gridAtoms
不变?
答案 0 :(得分:1)
执行list(<another list>)
只是执行列表的浅表副本,而不是深层副本,因此如果列表本身包含可变对象,则通过引用复制这些对象,即新列表将包含相同的引用,这些可变对象内的任何变化都会反映出整个列表。
显示此行为的示例 -
>>> 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]]