Lin*_*iao 2 python identity object memory-address
我有2个实例x和y同一个类RBnode.有没有交换自己的身份,让所有参考的方式x去y,反之亦然?
例如,
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
Run Code Online (Sandbox Code Playgroud)
实际上我正在构建红黑树的扩展.树的节点被实现为对象.在编写节点删除方法时,我需要交换两个节点,以便要删除的节点位于树的"底部".
首先,我尝试在两个节点中交换数据:
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
Run Code Online (Sandbox Code Playgroud)
但后来remove_node调用时发生错误,调用函数持有对节点的引用x,这恰好是y.next.就像是
x = y.next
self.remove_node(y)
x.parent
>>> AttributeError: 'NoneType' object has no attribute 'parent'
Run Code Online (Sandbox Code Playgroud)
我可以交换的所有相应的属性x和y.但这需要很多行,因为节点的结构相当复杂.
我一定错过了什么,因为这有什么不对?
>>> class RBnode(object):
... pass
...
>>> x = RBnode()
>>> y = RBnode()
>>> id(x), id(y)
(20552592, 20552528)
>>> x,y = y,x
>>> id(x), id(y)
(20552528, 20552592)
Run Code Online (Sandbox Code Playgroud)
或者您是否打算重新分配所有名称,例如某种对象的身份盗窃?虽然可以在C级工作,但如果你能在python中完成它而不会破坏主要内容,我会感到非常惊讶.