在对列表应用操作后,我希望同时访问修改后的列表和原始列表。不知何故,我做不到。
在下面的代码片段中,我定义了两个用来修改原始列表的函数。然后,我从一个类中获取值并应用转换。
def get_min_by_col(li, col): # get minimum from list
return min(li, key=lambda x: x[col - 1])[col - 1]
def hashCluster(coords): # transform to origin
min_row = get_min_by_col(coords,0)
min_col = get_min_by_col(coords,1)
for pix in coords:
pix[1] = pix[1] - min_row
pix[0] = pix[0] - min_col
return (coords)
pixCoords = hashCoords = originalPixCoords = [] # making sure they are empty
for j in dm.getPixelsForCluster(dm.clusters[i]):
pixCoords.append([j['m_column'], j['m_row']]) # getting some values from a class -- ex: [[613, 265], [613, 266]] or [[615, 341], [615, 342], [616, 341], [616, 342]]
originalPixCoords = pixCoords.copy() # just to be safe, I make a copy of the original list
print ('Original : ', originalPixCoords)
hashCoords = hashCluster(pixCoords) # apply transformation
print ('Modified : ', hashCoords)
print ('Original : ', originalPixCoords) # should get the original listJupyter Notebook的一些结果:
Original : [[607, 268]]
Modified : [[0, 0]]
Original : [[0, 0]]
Original : [[602, 264], [603, 264]]
Modified : [[0, 0], [1, 0]]
Original : [[0, 0], [1, 0]]
Original : [[613, 265], [613, 266]]
Modified : [[0, 0], [0, 1]]
Original : [[0, 0], [0, 1]]函数hashCluster是否也可以修改新列表?即使在.copy()之后
我做错了什么?我的目标是通过尽可能少的操作和列表副本访问原始列表和修改后的列表(因为我遍历的是一个非常大的文档)。
发布于 2020-05-17 03:14:12
使用
import copy
OriginalPixCoords= copy.deepcopy(pixCoords)发布于 2020-05-17 03:14:39
您正在使用的是一个浅层副本。这实际上意味着您创建了一个新的列表,并只指向旧的内存空间。这意味着如果这些对象被修改,你的新列表将仍然反映那些更新,因为它们发生在相同的内存空间中。
>>> # Shallow Copy
>>> mylist = []
>>> mylist.append({"key": "original"})
>>> mynewlist = mylist.copy()
>>> mynewlist
[{'key': 'original'}]
>>> mylist[0]["key"] = "new value"
>>> mylist
[{'key': 'new value'}]
>>> mynewlist
[{'key': 'new value'}]
>>> # Now Deep Copy
>>> mylist = []
>>> mylist.append({"key": "original"})
>>> from copy import deepcopy
>>> mynewlist = deepcopy(mylist)
>>> mynewlist
[{'key': 'original'}]
>>> mylist[0]["key"] = "new value"
>>> mylist
[{'key': 'new value'}]
>>> mynewlist
[{'key': 'original'}]另一个类似的问题:What is the difference between shallow copy, deepcopy and normal assignment operation?
发布于 2020-05-17 03:25:20
设置多个变量等于相同的值相当于Python中的指针。
看看这个
a = b = [1,2,3]
a == b # True
a is b # True (same memory location)
b[1] = 3
print(b) # [1,3,3]
print(a) #[1,3,3]现在,您正在创建浅层副本。如果您需要两个副本(具有不同的值和数据历史记录),则只需按以下方式分配变量:
import copy
original = data
original_copy = copy.deepcopy(data)
original_copy == original == data # True
original_copy is original # False
original_copy[0] = 4
original_copy == original # Falsehttps://stackoverflow.com/questions/61842121
复制相似问题