浅层的对象列表

时间:2017-06-28 20:17:27

标签: python list python-3.x class

将对象的引用从一个列表传输到另一个列表的最佳方法是什么(将对象从一个列表移动到另一个列表)。为清楚起见,我需要在复制后从SELECT questions.title, links.url FROM questions, answers, links, tags WHERE questions.qid = tags.qid AND answers.qid = questions.qid AND answers.aid = links.aid AND (tags.tag = 'php' OR tags.tag = 'mysql') GROUP BY tags.qid, links.url HAVING count(*) = 2; 删除对象

d[1]

2 个答案:

答案 0 :(得分:3)

哪种方法最好取决于周围代码的细节。是否有任何其他变量或数据结构包含对您的任一列表的引用?如果没有,你可以重新绑定dict中的引用(由于没有发生复制,这需要O(1)次:)

d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []}
d[2] = d[1]
d[1] = []

如果可能存在对现有列表的其他引用,并且您希望它们继续引用正确的值(例如,对d[1]的旧引用仍应在更改后引用d[1],那么您需要做一个切片赋值后跟一个clear(这是O(N)):

d[2][:] = d[1] # copy data
d[1].clear()

我认为没有充分的理由使用任何其他方法,除非您有其他逻辑要应用(例如,如果您只想复制某些值而不是其他值)。

答案 1 :(得分:1)

添加字典会掩盖用例。根据您的示例,您不清楚是否需要对象的副本或引用相同对象的列表。

假设后者,请考虑简化案例。它就像将列表分配给另一个变量一样简单:

>>> class MyObject(object):
...     def __init__(self, v):
...         self.value = v
...
>>> x = [MyObject(1), MyObject(2)]
>>> y = x
>>> x[1].value
2

现在,xy都是相同引用对象的列表。如果我在一个列表中更改对象,它将在另一个列表中更改:

>>> y[1].value = 3
>>> x[1].value
3

在您的用例(具有列表值的字典)中,这很简单:

d[2] = d[1]

然后,您可以根据需要删除1密钥:

del d[1]

瞧!