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): 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])]
4

1 回答 1

1

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

我想您可以__deepcopy__在您的类中实现一个方法,该方法返回一个副本,该副本维护对原始对象的一些引用。然后您可以使用该引用z[0]从副本中获取原始对象 , zcopy[0]。不过,这让我觉得这是一件相当奇怪的事情,而且可能不是一个好主意。如果没有更多信息,我建议只使用copy.copy而不是copy.deepcopy.

于 2010-08-10T19:38:28.093 回答