body
- это просто ссылка на self.last
- это единственное место, где происходит присвоение (body = self.last
). Это часто имеет имя tmp
или old_last
или подобное.
Это необходимо, поскольку self.last
больше не ссылается на последний узел в очереди, начиная с self.last = Node(data)
. Теперь, поскольку body
является старым последним , его значение узла было None
(это инвариант, который должен быть истинным - проверьте его!). Поскольку мы не хотим, чтобы он был последним больше, мы устанавливаем его для нового узла, который мы создали - на который хорошо ссылается self.last
, который мы только что переназначили. Вот почему body.node = self.last
прав: последний узел old теперь указывает на последний узел new (который, как мы хотим, указывает на None
).
Здесь нет ничего рекурсивного - просто временная переменная, содержащая ссылку на старую последнюю.
Когда очередь пуста, вы попадаете на:
self.first = self.last
где узел инициализируется впервые (в очереди). Заметьте, это означает, что у вас есть незначительная ошибка , вы теряете первую ссылку в __init__
на первую Node(None)
, фактически «утечку памяти» в других языках, но это мало что значит в Python.
Настоящая ошибка заключается в том, что если вы дважды dequeue
создаете новую очередь - попробуйте. Первый раз установит first
на None
(что не является Node
), а второй сломается, так как None
не имеет data
члена.
В целом реализация некорректна - я бы ее переделал.