Указатели в Python на переменные со значением None - PullRequest
0 голосов
/ 14 мая 2009

У меня есть метод, который создает новый узел в дереве - левый или правый. Если значение меньше моего текущего значения, оно вставляется слева, в противном случае справа.

Я хочу реорганизовать этот код, чтобы я сначала увидел, с какой стороны мне нужно вставить свой элемент, а затем вставил его. До того, как я реализовал это дважды: один раз для левой стороны и один раз для правой стороны.

В настоящее время это выглядит так:

def neu(self, sortByValue, secondValue):
    child = self.left if(sortByValue.lower() < self.value[0].lower()) else self.right

    if(child == None):
        child = MyTree(sortByValue,secondValue)
    else: child.neu(sortByValue,secondValue)

Моя проблема, однако, в том, что self.left - None, а self.right - None. Поэтому, когда я создаю child как переменную и устанавливаю его в MyTree (...), self.left и self.right не получают значения.

Что я могу сделать, чтобы улучшить это? Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 мая 2009

В Python переменные - это имена, а не местоположения. Например:

>>> a = 1
>>> b = a
>>> a = 2
>>> print b
1

В вашем коде вы просто привязываете имя child к другому значению (вашему новому узлу), и это не влияет на ранее привязанное значение (Нет).

Вот переделка вашего кода, который должен делать то, что вы хотите (не проверено):

def neu(self, sortByValue, secondValue):
    def child(node):
        if(node is None):
            return MyTree(sortByValue, secondValue)
        else:
            child.neu(sortByValue, secondValue)
            return node

    if(sortByValue.lower() < self.value[0].lower()):
        self.left = child(self.left)
    else:
        self.right = child(self.right)
0 голосов
/ 14 мая 2009

Почему вы используете дерево?

Я бы использовал словарь:

Инициализация:

tree = {}

Добавление нового узла:

дерево [sortByValue] = secondValue

Извлечение вещей

дерево печати [sortByValue]

Не прямой ответ, а более питонический способ сделать это

0 голосов
/ 14 мая 2009

Привет; -)

self.left или self.right не получают значение, поскольку вы присваиваете значение child, которое просто содержит копию целевого значения и не ссылается на него.

Вы хотите иметь указатель - он не существует напрямую в Python.

Вы можете выразить это, используя оболочку класса, но я думаю, что это более понятно, когда вы просто пишете обе возможности в предложении if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...