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列表中再次包含一些可变对象,比如某个自定义类或其他对象的实例,那么您可能会再次遇到问题。