Python元组解包反转链表(LeetCode206)的错误原因解析
反转链表中Python元组并行赋值的差异解析
核心问题
在LeetCode 206反转链表场景下,分步赋值写法可正常运行,但两种元组并行赋值写法结果截然不同:
- Method-1:
prev, head, head.next = head, head.next, prev触发AttributeError: 'NoneType' object has no attribute 'next' - Method-2:
prev, head.next, head = head, prev, head.next可正确完成链表反转
Python元组并行赋值机制
Python的元组并行赋值遵循两个关键规则:
- 先求值,后赋值:右侧所有表达式会先被计算,生成一个临时元组保存所有原始值
- 左到右依次赋值:左侧变量按顺序接收临时元组中的对应值,前一个赋值可能影响后续操作
两种写法的差异根源
Method-1 报错原因
执行流程拆解:
- 先计算右侧所有值:得到
(当前prev的值, 当前head.next的值, 当前prev的值)(所有值都是赋值前的原始状态) - 按左到右顺序赋值:
- 第一步:
prev = 当前head的值(prev被更新) - 第二步:
head = 当前head.next的值(如果当前head.next是None,head直接变成None) - 第三步:尝试给
head.next赋值,但此时head已经是None,自然触发属性不存在的错误
- 第一步:
Method-2 正常运行原因
执行流程拆解:
- 先计算右侧所有值:得到
(当前head的值, 当前prev的值, 当前head.next的值)(同样是原始状态的值) - 按左到右顺序赋值:
- 第一步:
prev = 当前head的值(prev更新) - 第二步:
head.next = 当前prev的值(此时head还是原始的head节点,还未被修改,可正常访问next属性,完成指针反转) - 第三步:
head = 当前head.next的值(将head移动到下一个节点,为下一轮循环做准备)
- 第一步:
可行解决方案
- 采用Method-2的并行赋值写法:确保在修改
head变量之前,先完成原head.next的指针反转操作 - 分步赋值写法(逻辑更直观,适合新手):
next_node = head.next head.next = prev prev = head head = next_node
内容的提问来源于stack exchange,提问作者Saketh
相关产品推荐
相关产品推荐

