Python多变量赋值顺序是否重要?LeetCode206反转链表问题咨询
LeetCode 206题反转链表:多变量赋值顺序导致的问题解析
问题场景
我在解决LeetCode第206题(反转链表)时,编写了如下代码:
class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ if head: if head.next: curr1 = head curr2 = head.next curr1.next = None while curr2: #curr1, curr2.next, curr2 = curr2, curr1, curr2.next #curr2.next, curr2, curr1 = curr1, curr2.next, curr2 curr1, curr2, curr2.next = curr2, curr2.next, curr1 return curr1 return head
代码中while循环内的两行注释代码均可正常运行,但当前未注释的代码会因超时失败。核心疑问是:改变变量赋值顺序为何会产生差异?Python多变量赋值的顺序是否会影响结果?
核心原理:Python多变量赋值机制
Python的多变量赋值遵循先计算右侧所有表达式的结果,再按左侧顺序依次赋值的规则。也就是说,右侧所有值的计算都是基于赋值前的变量状态,但左侧的赋值顺序会直接影响后续赋值操作所使用的变量状态。
三种赋值方式的具体分析
1. 第一种可行写法:curr1, curr2.next, curr2 = curr2, curr1, curr2.next
- 右侧先计算三个值:原
curr2、原curr1、原curr2.next - 按顺序赋值:
curr1更新为原curr2curr2.next指向原curr1(完成当前节点的反转)curr2移动到原curr2.next(推进循环)
整个过程逻辑清晰,链表反转和循环推进都正常执行。
2. 第二种可行写法:curr2.next, curr2, curr1 = curr1, curr2.next, curr2
- 右侧先计算三个值:原
curr1、原curr2.next、原curr2 - 按顺序赋值:
curr2.next指向原curr1(完成当前节点反转)curr2移动到原curr2.next(推进循环)curr1更新为原curr2(作为下一次反转的前置节点)
同样,所有操作基于赋值前的变量状态,循环正常推进,链表正确反转。
3. 超时的错误写法:curr1, curr2, curr2.next = curr2, curr2.next, curr1
- 右侧先计算三个值:原
curr2、原curr2.next、原curr1 - 按顺序赋值:
curr1更新为原curr2curr2被替换为原curr2.next(此时curr2已经指向了下一个节点)- 给
curr2.next赋值为原curr1——这里的curr2已经是新的节点(原curr2.next),所以修改的是新节点的next指针,而非原本需要反转的curr2的next指针。
这就导致原本的curr2节点没有被正确反转,且新的curr2的next指向了原curr1,后续循环中curr2会在两个节点间来回跳转,陷入死循环,最终触发超时。
结论
Python多变量赋值的顺序确实会影响结果。虽然右侧表达式的计算是一次性完成的,但左侧的赋值顺序会改变后续赋值操作所使用的变量状态。如果赋值顺序不当,会导致变量引用的对象提前被修改,进而破坏逻辑的正确性。
内容的提问来源于stack exchange,提问作者Nikola Jakovljevic
相关产品推荐
相关产品推荐

