Python 通过更改某些元素从另一个列表中赋值来追加列表

Python 通过更改某些元素从另一个列表中赋值来追加列表,python,list,python-2.7,Python,List,Python 2.7,我有一个列表,我想从这个列表中构造另一个列表,方法是丢弃一些元素并更改一些元素。我正在做以下工作: 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

我有一个列表,我想从这个列表中构造另一个列表,方法是丢弃一些元素并更改一些元素。我正在做以下工作:

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
不变?

执行
list()
只是对列表进行浅层复制,而不是深度复制,因此如果列表本身包含可变对象,则这些对象通过引用进行复制,即新列表将包含相同的引用,而这些可变对象内部的任何更改都将反映accross列表

示例来显示此行为-

>>> 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]]

哦,好的。因此,如果
l
是一个1d列表,它就可以了,对吗?是的,如果它是一个1d列表,包含不可变对象(如int/float/string等),
list()
就足够了。如果1d列表中再次包含一些可变对象,比如某个自定义类或其他对象的实例,那么您可能会再次遇到问题。