You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的元组并行赋值遵循两个关键规则:

  1. 先求值,后赋值:右侧所有表达式会先被计算,生成一个临时元组保存所有原始值
  2. 左到右依次赋值:左侧变量按顺序接收临时元组中的对应值,前一个赋值可能影响后续操作

两种写法的差异根源

Method-1 报错原因

执行流程拆解:

  1. 先计算右侧所有值:得到(当前prev的值, 当前head.next的值, 当前prev的值)(所有值都是赋值前的原始状态)
  2. 按左到右顺序赋值:
    • 第一步:prev = 当前head的值(prev被更新)
    • 第二步:head = 当前head.next的值(如果当前head.next是None,head直接变成None)
    • 第三步:尝试给head.next赋值,但此时head已经是None,自然触发属性不存在的错误

Method-2 正常运行原因

执行流程拆解:

  1. 先计算右侧所有值:得到(当前head的值, 当前prev的值, 当前head.next的值)(同样是原始状态的值)
  2. 按左到右顺序赋值:
    • 第一步:prev = 当前head的值(prev更新)
    • 第二步:head.next = 当前prev的值(此时head还是原始的head节点,还未被修改,可正常访问next属性,完成指针反转)
    • 第三步:head = 当前head.next的值(将head移动到下一个节点,为下一轮循环做准备)

可行解决方案

  1. 采用Method-2的并行赋值写法:确保在修改head变量之前,先完成原head.next的指针反转操作
  2. 分步赋值写法(逻辑更直观,适合新手):
next_node = head.next
head.next = prev
prev = head
head = next_node

内容的提问来源于stack exchange,提问作者Saketh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:44:57