2012-01-31 25 views
2

我有两个实例xy同一类RBnode。 有没有办法交换他们的身份,以便所有参考xy,反之亦然?如何在Python中交换2个对象的身份?

例如,

x = RBnode() 
y = RBnode() 
x.data = 1 
y.data = 2 
L = [x,y] 

exchange_identity(x,y) 
print x.data, y.data, (L[0] is y) 

>>> 2 1 True 

其实我建立红黑树的延伸。树的节点被实现为对象。在编写节点删除方法时,我需要交换两个节点,以便要删除的节点位于树的“底部”。

首先,我想只是在两个节点交换数据:

def remove_node(self, y): 
    ''' remove node y from tree 
    return (y.key,y.value) if successful''' 
... ... ... 

    # exchange y's data with that of its successor y.next 

    y.key = y.next.key 
    y.value = y.next.value 

但后来发生错误时remove_node被调用,调用函数拿着一个参考节点x,这恰好是y.next 。喜欢的东西

x = y.next 
self.remove_node(y) 
x.parent 
>>> AttributeError: 'NoneType' object has no attribute 'parent' 

我可以交流的xy所有相应的属性。 但是,由于节点的结构相当复杂,因此需要很多行。

+1

您可能会感兴趣的http://stackoverflow.com/questions/ 7255777/can-i-efficient-swap-two-class-instances-by-swapping-dict(but there be dragons。) – DSM 2012-01-31 05:38:06

回答

6

我一定错过了一些东西,因为这有什么不对?

>>> class RBnode(object): 
... pass 
... 
>>> x = RBnode() 
>>> y = RBnode() 
>>> id(x), id(y) 
(20552592, 20552528) 
>>> x,y = y,x 
>>> id(x), id(y) 
(20552528, 20552592) 

或者你意味着重新分配所有的名字,像某种对象的身份盗窃的?尽管可能在C级工作,但如果你可以在python内部完成而不会大幅破坏,我会很惊讶。

+0

我想做一些事情,比如交换两个对象的内存地址,我想这就是你所说的'身份盗窃'。我只是好奇,如果这可能在Python中。谢谢! – Linxiao 2012-01-31 05:50:59

+1

您可以在交换对​​象的内容时使用,或者您可以意识到并没有真正的许多引用来重新指定并交换树中的节点位置,也可以添加一个间接级别。 – 2012-01-31 07:55:32

1

“身份盗窃”在Python中是不可能的;然而,你通常可以交换内容两个不同的对象的(甚至交换用户定义的类):

>>> n = Node() 
>>> o = Node() 
>>> p = Node(n, o) 
>>> q = Node() 
>>> r = Node(p, q) 

>>> # swap bodies of p and r 
>>> p.left, p.right, r.left, r.right = p.right, p.left, r.right, r.left