列表操作,跟踪旧列表

问题描述 投票:1回答:3

在对列表进行操作后,我想同时访问修改后的列表和原始列表。我不知何故不能。

在下面的代码片段中,我定义了两个函数,用于修改原始列表。然后,我从一个类中获取值并应用转换。

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 list

某些结果[Jupyter笔记本]:

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()之后?

我在做什么错?我的目标是要访问原始列表和修改后的列表,并尽可能减少列表的操作和副本(因为我要遍历一个非常大的文档)。

python python-3.x list
3个回答
0
投票

使用

import copy
OriginalPixCoords= copy.deepcopy(pixCoords)

0
投票

您正在使用的是浅表副本。它实际上意味着您创建了一个新列表,并仅指向旧的内存空间。意味着如果这些对象被修改,则新列表仍将反映这些更新,因为它们发生在相同的内存空间中。

>>> # 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?


0
投票

设置多个等于相同值的变量等同于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  # False
© www.soinside.com 2019 - 2024. All rights reserved.