У меня есть 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
На самом деле я строю расширениекрасно-черного дерева.Узлы дерева реализованы как объект.При написании метода удаления узла мне нужно обменяться двумя узлами, чтобы удаляемый узел оказался «внизу» дерева.
Сначала я попытался просто обменяться данными в двух узлах:
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'
Я мог бы обменять все соответствующие атрибуты x
и y
.Но это занимает довольно много строк, так как структура узла довольно сложна.