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

一行多赋值引发死循环:两段Python代码为何执行结果不同?

为什么两段看似相同的代码执行结果天差地别?

在LeetCode二叉树展开为链表的题目中,你写的两段代码看起来逻辑一致,但一段能通过测试,另一段却陷入死循环超时,核心原因是Python链式赋值的执行顺序和你想的不一样。

两段代码对比

  • 正常运行的代码:
node.right = rights.pop()
node = node.right
  • 导致死循环的代码:
node = node.right = rights.pop()

问题根源

Python的链式赋值是从左到右依次完成赋值的,而不是从右到左。以a = b = c为例,执行逻辑是:

  1. 先计算最右侧的c,得到临时值;
  2. 把临时值赋值给a;
  3. 再把临时值赋值给b。

放到你的代码里,node = node.right = rights.pop()的执行步骤拆解后是:

  1. 执行rights.pop(),得到某个二叉树节点Y;
  2. 把Y直接赋值给变量node,此时node指向Y;
  3. 把Y赋值给node.right——此时node已经是Y了,相当于把Y的right指针指向了它自己!

这就造成了死循环:后续每次循环,node永远指向Y,而Y的right是它自己,每次都会把Y重新加入rights列表,再弹出Y重复赋值,永远无法退出循环。

而分开写的代码执行逻辑完全不同:

  1. 先把rights.pop()得到的Y赋值给当前node(假设是节点X)的right属性,也就是X.right = Y;
  2. 再把node变量指向X.right(也就是Y)。
    这里Y的right属性保持了原有结构,不会出现自指向,循环能正常推进。

完整代码参考

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        rights = []
        node = root
        while node:
            if node.right:
                rights.append(node.right)
            if node.left:
                node.right = node.left
                node.left = None
                node = node.right
            elif len(rights):
                # 用这段代码就能正常运行
                node.right = rights.pop()
                node = node.right
        else:
            return root

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:25:15