将对象的引用从一个列表传输到另一个列表的最佳方法是什么(将对象从一个列表移动到另一个列表)。为清楚起见,我需要在复制后从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]
答案 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
现在,x
和y
都是相同引用对象的列表。如果我在一个列表中更改对象,它将在另一个列表中更改:
>>> y[1].value = 3
>>> x[1].value
3
在您的用例(具有列表值的字典)中,这很简单:
d[2] = d[1]
然后,您可以根据需要删除1
密钥:
del d[1]
瞧!