2017-06-28 68 views
0

将对象的引用从一个列表转移到另一个列表的最佳方式是什么(将对象从一个列表移动到另一个列表)。为了清楚起见,我需要复制对象的浅拷贝列表

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) 
+0

*“最佳”*具体如何?它是否破坏了以前的列表(你的一些建议是,有些不是)是否重要?为什么不选择一个,把时间花在其他更有用的东西上呢? – jonrsharpe

+0

[如何克隆或复制列表?]可能的重复?(https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) – victor

+0

哪些*“people”*?为什么不问*他们*他们更喜欢哪一个?或者一旦你有更实际的东西一起使用[codereview.se]? – jonrsharpe

回答

3

哪种方法最好取决于周围代码的细节。其他变量或数据结构是否包含对任何一个列表的引用?如果没有,你可以重新绑定在字典的引用(这需要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() 

我不认为有一个很好的理由使用任何其他方法,除非你有其他的逻辑适用(for实例,如果你只想复制一些值而不是其他值)。

1

添加一个词典掩盖了用例之后,除去从d[1]的对象。根据你的例子,目前还不清楚你是想要一个拷贝的对象还是一个列表引用相同的对象。

假设后者,考虑简化的情况。这是真正的分配名单另一个变量一样简单:

>>> class MyObject(object): 
...  def __init__(self, v): 
...   self.value = v 
... 
>>> x = [MyObject(1), MyObject(2)] 
>>> y = x 
>>> x[1].value 
2 

现在,无论xy是相同的引用对象的列表。如果我改变对象的一个​​列表,它会在其他变化:

>>> y[1].value = 3 
>>> x[1].value 
3 

在你的使用情况(与列表值的字典),这是很简单的:

d[2] = d[1] 

然后,您可以如有必要删除1键:

del d[1] 

瞧!