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

Python链表交换机制:为何多变量赋值语句执行结果不同?

Python并行赋值机制与链表反转代码差异解析

Python的并行赋值(元组解包赋值)有个核心执行规则:先一次性计算等号右侧所有表达式的结果,存入临时元组,再按从左到右的顺序,把元组里的值依次赋值给左侧的变量或属性。这就是两种写法效果天差地别的根本原因。

能正常工作的并行赋值代码

cur.next, cur, prev = prev, cur.next, cur

执行步骤拆解:

  1. 先计算右侧三个表达式的原始值,得到临时元组:(当前prev的值, 当前cur.next的节点, 当前cur的节点)
  2. 按顺序赋值:
    • 把临时元组第一个值(旧prev)赋给cur.next → 正确修改当前cur的next指针,指向prev,完成反转的关键一步
    • 把临时元组第二个值(旧cur.next)赋给cur → 让cur移动到下一个节点
    • 把临时元组第三个值(旧cur)赋给prev → 更新prev为当前cur的旧值,为下一次迭代做准备

这个逻辑和标准多行写法完全一致,相当于把"保存原始值"的操作交给了Python的临时元组处理。

无法正常工作的并行赋值代码

cur, cur.next, prev = cur.next, prev, cur

执行步骤拆解:

  1. 同样先计算右侧三个表达式的原始值,得到临时元组:(当前cur.next的节点, 当前prev的值, 当前cur的节点)
  2. 按顺序赋值:
    • 把临时元组第一个值(旧cur.next)赋给cur → 这一步直接让cur变量指向了原来的下一个节点,此时cur已经不是原来的目标节点了
    • 把临时元组第二个值(旧prev)赋给cur.next → 这里修改的是新cur(原cur.next节点)的next指针,而非你原本要修改的原cur的next指针,逻辑彻底偏离反转需求
    • 最后把临时元组第三个值(旧cur)赋给prev → 这一步虽无错误,但前面的逻辑偏差已经导致整个反转流程失效

对比标准多行写法

tmp = cur.next
cur.next = prev
prev = cur
cur = tmp

这是链表反转的标准实现,核心是通过tmp提前保存cur.next的原始值,避免后续修改cur指针后丢失该值。能正常工作的并行赋值本质是利用Python的临时元组特性,提前缓存所有需要的原始值,再按正确顺序完成赋值,和多行写法的执行逻辑完全对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:33:13