自定义类实例复制

1 投票
1 回答
2714 浏览
提问于 2025-04-16 02:36

我刚开始学习编程和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 not in list

有没有简单的方法可以通过深拷贝的列表中的引用来移除列表中的元素呢?

补充:谢谢大家的回答。我找到了一些使用索引的解决方案。虽然看起来不太好,但确实能解决问题:

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 个回答

1

不可以,因为调用 deepcopy 会创建一个 some_class 实例的副本。这个副本 zcopy[0] 和原来的 z[0] 是两个不同的对象,所以当你试图从列表 z 中删除 zcopy[0] 时,它会正确地提示你,副本在原列表中并不存在。而且,复制的对象和原对象之间没有任何联系,这正是 deepcopy

我想你可以在你的类中实现一个 __deepcopy__ 方法,这样可以返回一个保持与原对象某种关联的副本。然后你就可以通过这个关联,从副本 zcopy[0] 中获取原对象 z[0]。不过我觉得这样做有点奇怪,可能不是个好主意。在没有更多信息的情况下,我建议你直接使用 copy.copy 而不是 copy.deepcopy

撰写回答