Порядок операций для трех (или более) различных назначений переменных с использованием связанного списка в Python 3 ⇐ Python
Порядок операций для трех (или более) различных назначений переменных с использованием связанного списка в Python 3
Я пишу простой код для реверсирования связанного списка и понял, что назначения можно выполнять в одной строке, и это показалось мне очень крутым:
def Reverse(head): предыдущий_узел = Нет curr_node = голова в то время как curr_node: prev_node, curr_node.next, curr_node = curr_node, prev_node, curr_node.next вернуть предыдущий_узел Но я заметил, что код дает сбой, если я меняю порядок присвоений между curr_node.next в левой части (соответствует prev_node в правой части) и curr_node в левой части (...curr_node.next в правой части) def Reverse(head): предыдущий_узел = Нет curr_node = голова печать (curr_node.data) печать(curr_node.next.data) печать (предыдущий_узел) в то время как curr_node: prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node вернуть предыдущий_узел Ввод
1 2 3 4 Выход
1 2 Никто Но в цикле while возникает следующая ошибка (только во втором блоке кода; первый работает нормально)
prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node AttributeError: объект «NoneType» не имеет атрибута «следующий» Ближайшее обсуждение этой темы, которое я смог найти, было здесь. В котором говорится, что сначала оценивается RHS, слева направо. Я думаю, это означает, что сохраняется curr_node, затем prev_node, затем curr_node.next. Затем они назначаются prev_node, curr_node.next и curr_node соответственно. Я не вижу разницы между первым и вторым примером. Я упускаю что-то простое?
Кто-нибудь знает, почему первый пример выполняется, а второй выдает ошибку?
Я пишу простой код для реверсирования связанного списка и понял, что назначения можно выполнять в одной строке, и это показалось мне очень крутым:
def Reverse(head): предыдущий_узел = Нет curr_node = голова в то время как curr_node: prev_node, curr_node.next, curr_node = curr_node, prev_node, curr_node.next вернуть предыдущий_узел Но я заметил, что код дает сбой, если я меняю порядок присвоений между curr_node.next в левой части (соответствует prev_node в правой части) и curr_node в левой части (...curr_node.next в правой части) def Reverse(head): предыдущий_узел = Нет curr_node = голова печать (curr_node.data) печать(curr_node.next.data) печать (предыдущий_узел) в то время как curr_node: prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node вернуть предыдущий_узел Ввод
1 2 3 4 Выход
1 2 Никто Но в цикле while возникает следующая ошибка (только во втором блоке кода; первый работает нормально)
prev_node, curr_node, curr_node.next = curr_node, curr_node.next, prev_node AttributeError: объект «NoneType» не имеет атрибута «следующий» Ближайшее обсуждение этой темы, которое я смог найти, было здесь. В котором говорится, что сначала оценивается RHS, слева направо. Я думаю, это означает, что сохраняется curr_node, затем prev_node, затем curr_node.next. Затем они назначаются prev_node, curr_node.next и curr_node соответственно. Я не вижу разницы между первым и вторым примером. Я упускаю что-то простое?
Кто-нибудь знает, почему первый пример выполняется, а второй выдает ошибку?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение