Итерация по связанному списку с цепочкой назначений - PullRequest
0 голосов
/ 23 апреля 2020

Допустим, у меня есть следующие имена и объекты

original = n = <original_object>
n = n.next = <new_object>

После запуска вышеупомянутого я бы ожидал увидеть original, указывающий на <original_object>, но это не так.

Однако, если я вместо этого сделаю:

original = n = <original_object>
n.next = <new_object> # Attribute of the object class
n = n.next

, тогда я вижу original, указывающий на <original_object> (или, по крайней мере, это то, что, я думаю, я вижу).

Конкретный пример

Я проиллюстрирую это связанным списком в Python 3.8:

class Node:
    def __init__(self, arg1):
        self.next = None

С цепочечными присвоениями:

head = n = Node(None)
n = n.next = Node(None)
print(head.next) # None (the "head" is gone?)

С последовательными назначениями:

head = n = Node(None) 
n.next = Node(None) # *
n = n.next # *
print(head.next) # <__main__.Node object at 0x7fa4e0610ca0>

Мое намерение здесь состоит в том, чтобы сохранить "заголовок" связанного списка, так как я добавляю узлы в хвост. Почему я получаю разные результаты с цепочкой от последовательных заданий?

1 Ответ

0 голосов
/ 23 апреля 2020

Как быстро заметил @ Carcigenicate , этот ответ объясняет, что происходит:

Короче, следуя этому аргументу в моем примере, если я это сделаю:

n = n.next = Node(None)

, что эквивалентно:

temp = Node(None)
n = temp
n.next = temp

, поэтому n присваивается новый узел до I "продвигает текущий указатель" (n) в связанном списке, в то время как я хочу создать сначала новый узел, ссылку на него, а , а затем «продвинуть текущий указатель» (n) на новый узел.

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