2016-04-01 49 views
0

我有一個python列表,其中包含一組對象(具有它自己的 屬性和函數和變量的類)。我想提取一些列表元素並創建一個新列表。如何從Python中的列表構建一個新列表?

我的問題是:新列表中的元素會保持相同,否則當我從列表中提取它們時,它們將被視爲該類的新實例?

例如:List layer = [myclass1, myclass2, myclass3]

我想新的列表layernew = [myclass1]或任何這樣的組合。我如何提取項目。當我直接打印圖層和新圖層時(通過使用newlayer=layer[0:1]),我看到它給了我對象的相同實例引用。

+0

如果問題是,我的新列表中的項目是否相同,是的,他們是。您只複製對象的引用,因此您的列表僅包含引用 – Whitefret

+0

列表不包含對象,它們包含*引用*。順便說一句,儘量不要使用短語「set of objects」,除非你的意思是「set」 - 這是令人困惑的! – cdarke

回答

4

是新的列表elments會繼續保持相同或當我從列表中提取他們,他們將被視爲類的新實例。

它們將是相同的。演示:

class Widget: 
    def __init__(self, value): 
     self.value = value 

a = [Widget(4), Widget(8), Widget(15)] 
b = a[0:1] 

print a[0] is b[0] 

輸出是True,所以a[0]b[0]是同一個對象的引用。

更改此行爲的一種方法是使用copy模塊的deepcopy方法。這將試圖複製你給它的對象,並返回一個具有相同值的引用不同的對象。

import copy 

class Widget: 
    def __init__(self, value): 
     self.value = value 

a = [Widget(4), Widget(8), Widget(15)] 
b = copy.deepcopy(a[0:1]) 

print a[0] is b[0] 
#result: False 
+0

感謝您對深層次的解釋和參考。想要接受答案,但目前不能。 – user3840530

+0

嗨,我的對象實例正在混亂。深部拷貝確實解決了這個問題。萬分感謝! – user3840530

+0

@ user3840530:好吧,我想現在你可以接受這個答案了嗎? – vaultah

2

它們是完全相同的對象。您可以在python中使用is進行身份測試。

layernew[0] is layer[0] # True 
+0

感謝您的快速響應。 – user3840530

相關問題