2012-01-31 70 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