将对象的引用从一个列表转移到另一个列表(将对象从一个列表移动到另一个列表)的最佳方法是什么。为了清晰起见,我需要在复制后从d[1]中删除对象
class MyObject:
def __init__(self,v):
self.value = v
d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []}
#which one?
#d[2] = [obj for obj in d[1]]
#d[2] = d[1][:]
#d[2] = d[1].copy()
#clear d[1]
#d[1] = []
for i in range(len(d[1])):
d[2].append(d[1].pop(0))
for o in d[2]:
print (o.value)发布于 2017-06-28 20:24:55
哪种方法最好,这在一定程度上取决于周围代码的细节。是否有任何其他变量或数据结构包含对任何列表的引用?如果没有,您可以重新绑定dict中的引用(这需要O(1)时间,因为没有复制):
d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []}
d[2] = d[1]
d[1] = []如果对现有列表的其他引用可能存在,并且希望它们继续引用正确的值(例如,在更改之后,对d[1]的旧引用仍然应该引用d[1] ),那么您希望执行一个片赋值,然后是一个清除(这是O(N)):
d[2][:] = d[1] # copy data
d[1].clear()我不认为有充分的理由使用任何其他方法,除非您有其他的逻辑可应用(例如,如果您只想复制一些值,而不是其他的)。
发布于 2017-06-28 20:23:35
添加字典会模糊用例。根据您的示例,不清楚您想要对象的副本还是引用相同对象的列表。
假设是后者,则考虑简化的情况。它实际上就像将列表赋值给另一个变量一样简单:
>>> class MyObject(object):
... def __init__(self, v):
... self.value = v
...
>>> x = [MyObject(1), MyObject(2)]
>>> y = x
>>> x[1].value
2现在,x和y都是同一个引用对象的列表。如果我在一个列表中更改对象,它将在另一个列表中更改:
>>> y[1].value = 3
>>> x[1].value
3在您的用例中(包含列表值的字典),这非常简单:
d[2] = d[1]如果有必要,可以删除1键:
del d[1]瞧!
https://stackoverflow.com/questions/44811823
复制相似问题