2010-08-10 145 views
-1

我是编程和Python新手。我遇到的问题是删除作为自定义类实例的列表元素。自定义类实例复制

import copy 

class some_class: 
    pass 

x = some_class() 
x.attr1 = 5 
y = some_class() 
y.attr1 = 5 

z = [x,y] 
zcopy = copy.deepcopy(z) 
z.remove(zcopy[0]) 

这将返回: ValueError异常:list.remove(X):在列表

有一个简单的方法,通过使用从deepcopied列表引用删除从列表元素X不是?

编辑:感谢您的回答。我发现了一些使用索引的解决方案。它不漂亮,但它的工作:

import copy 

class some_class: 
    pass 

x = some_class() 
x.attr1 = 5 
y = some_class() 
y.attr1 = 5 

z = [x,y] 
zcopy = copy.deepcopy(z) 
del z[zcopy.index(zcopy[0])] 
+2

你应该避免这种复制。可能有更简单的方法来分割列表。你想做什么? – 2010-08-10 19:35:20

+0

基本上,我使用的函数,应用时,通过执行计算(某种蒙特卡洛模拟)修改此列表。所以,我想在实例副本上使用函数,并从原始列表中删除答案(从运行模拟中获得答案),以便我可以在修改的列表上再次运行模拟。 list - > function(list of copy) - > answer - > 从原始列表中删除答案 - >函数(删除答案的列表副本) - > ... – declain 2010-08-10 19:54:20

+1

这不是一个很好的设计。你不应该把答案放在同一个列表中。您需要过滤,创建新列表,而不是更新现有列表。你很少需要复制任何东西。你应该发布更多关于你的算法的细节,以便我们帮你修复它。 – 2010-08-10 20:49:26

回答

1

没有,因为调用deepcopy创建some_class实例的副本。该副本zcopy[0]与原始的z[0]是不同的对象,因此当您尝试从列表z中删除zcopy[0]时,它正确地抱怨该副本不存在于原始列表中。此外,复制对象与原始对象之间没有链接,这是deepcopy的意图。

我想你可以在你的类中实现一个__deepcopy__方法,该方法返回一个副本,该副本维护对原始对象的一些引用。然后,您可以使用该引用从副本zcopy[0]中获取原始对象z[0]。尽管如此,这让我觉得很奇怪,可能不是一个好主意。没有进一步的信息,我建议只使用copy.copy而不是copy.deepcopy