2017-06-28 69 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] 

瞧!