一行多赋值引发死循环:两段Python代码为何执行结果不同?
为什么两段看似相同的代码执行结果天差地别?
在LeetCode二叉树展开为链表的题目中,你写的两段代码看起来逻辑一致,但一段能通过测试,另一段却陷入死循环超时,核心原因是Python链式赋值的执行顺序和你想的不一样。
两段代码对比
- 正常运行的代码:
node.right = rights.pop() node = node.right
- 导致死循环的代码:
node = node.right = rights.pop()
问题根源
Python的链式赋值是从左到右依次完成赋值的,而不是从右到左。以a = b = c为例,执行逻辑是:
- 先计算最右侧的
c,得到临时值; - 把临时值赋值给
a; - 再把临时值赋值给
b。
放到你的代码里,node = node.right = rights.pop()的执行步骤拆解后是:
- 执行
rights.pop(),得到某个二叉树节点Y; - 把
Y直接赋值给变量node,此时node指向Y; - 把
Y赋值给node.right——此时node已经是Y了,相当于把Y的right指针指向了它自己!
这就造成了死循环:后续每次循环,node永远指向Y,而Y的right是它自己,每次都会把Y重新加入rights列表,再弹出Y重复赋值,永远无法退出循环。
而分开写的代码执行逻辑完全不同:
- 先把
rights.pop()得到的Y赋值给当前node(假设是节点X)的right属性,也就是X.right = Y; - 再把
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
相关产品推荐
相关产品推荐

