Python链表交换机制:为何多变量赋值语句执行结果不同?
Python并行赋值机制与链表反转代码差异解析
Python的并行赋值(元组解包赋值)有个核心执行规则:先一次性计算等号右侧所有表达式的结果,存入临时元组,再按从左到右的顺序,把元组里的值依次赋值给左侧的变量或属性。这就是两种写法效果天差地别的根本原因。
能正常工作的并行赋值代码
cur.next, cur, prev = prev, cur.next, cur
执行步骤拆解:
- 先计算右侧三个表达式的原始值,得到临时元组:
(当前prev的值, 当前cur.next的节点, 当前cur的节点) - 按顺序赋值:
- 把临时元组第一个值(旧prev)赋给
cur.next→ 正确修改当前cur的next指针,指向prev,完成反转的关键一步 - 把临时元组第二个值(旧cur.next)赋给
cur→ 让cur移动到下一个节点 - 把临时元组第三个值(旧cur)赋给
prev→ 更新prev为当前cur的旧值,为下一次迭代做准备
- 把临时元组第一个值(旧prev)赋给
这个逻辑和标准多行写法完全一致,相当于把"保存原始值"的操作交给了Python的临时元组处理。
无法正常工作的并行赋值代码
cur, cur.next, prev = cur.next, prev, cur
执行步骤拆解:
- 同样先计算右侧三个表达式的原始值,得到临时元组:
(当前cur.next的节点, 当前prev的值, 当前cur的节点) - 按顺序赋值:
- 把临时元组第一个值(旧cur.next)赋给
cur→ 这一步直接让cur变量指向了原来的下一个节点,此时cur已经不是原来的目标节点了 - 把临时元组第二个值(旧prev)赋给
cur.next→ 这里修改的是新cur(原cur.next节点)的next指针,而非你原本要修改的原cur的next指针,逻辑彻底偏离反转需求 - 最后把临时元组第三个值(旧cur)赋给
prev→ 这一步虽无错误,但前面的逻辑偏差已经导致整个反转流程失效
- 把临时元组第一个值(旧cur.next)赋给
对比标准多行写法
tmp = cur.next cur.next = prev prev = cur cur = tmp
这是链表反转的标准实现,核心是通过tmp提前保存cur.next的原始值,避免后续修改cur指针后丢失该值。能正常工作的并行赋值本质是利用Python的临时元组特性,提前缓存所有需要的原始值,再按正确顺序完成赋值,和多行写法的执行逻辑完全对齐。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

