Я пишу простой код для реверсирования связанного списка и понял, что присваивания можно выполнять в одной строке, что мне показалось довольно крутым:
def Reverse(head):
prev_node = None
curr_node = head
while curr_node:
prev_node, curr_node.next, curr_node = curr_node, prev_node, curr_node.next
return prev_node
Но я заметил, что код дает сбой, если я изменяю порядок назначений между curr_node.next в левой части (соответствует prev_node в правой части) и curr_node в левой части (...curr_node.next в правой части)
def Reverse(head):
prev_node = None
curr_node = head
print(curr_node.data)
print(curr_node.next.data)
print(prev_node)
while curr_node:
prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node
return prev_node
Вход
1 2 3 4
Выход
1
2
None
Но из цикла while возникает следующая ошибка (только во втором блоке кода, первый работает нормально)
prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node
AttributeError: 'NoneType' object has no attribute 'next'
Самое близкое обсуждение, которое я смог найти по этому вопросу, было здесь. Что говорит о том, что RHS сначала оценивается слева направо. Я думаю, это означает, что хранится curr_node, затем prev_node, затем curr_node.next. Затем они назначаются prev_node, curr_node.next и curr_node соответственно. Я не вижу разницы между первым и вторым примером. Я пропустил что-то простое?
Кто-нибудь знает, почему первый пример запускается, а второй выдает ошибку?