自定义类实例复制

时间:2010-08-10 19:30:51

标签: python deep-copy

我是编程和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):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])]

1 个答案:

答案 0 :(得分:1)

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

我想你可以在你的类中实现一个__deepcopy__方法,它返回一个维护对原始对象的引用的副本。然后,您可以使用该引用从副本z[0]获取原始对象zcopy[0]。尽管如此,这对我来说是一件相当奇怪的事情,并且可能不是一个好主意。如果没有进一步的信息,我建议您使用copy.copy代替copy.deepcopy