海象运算符未正确赋值变量?归并排序代码出现r变量未绑定错误
问题原因分析
核心原因
这个问题是Python逻辑或(or)的短路求值特性导致的:
- Python中
A or B的求值规则为:如果A的布尔值为True,直接返回A的结果,完全不会执行B的代码;只有A为False时才会执行并返回B的结果。
对应你的代码中while的判断逻辑:
while (l := len(left)) or (r := len(right)):
l := len(left)是or的左操作数,每次进入循环判断条件时都会优先执行,所以l每次循环都会被赋值,永远不会出现未定义的问题。- 只要
left数组不为空(也就是len(left) > 0),左操作数的结果就为True,此时右操作数r := len(right)会被直接跳过执行,r变量在本次循环中没有被定义。 - 当你在后续的
if l and r and left[0] < right[0]判断中直接引用r时,就会触发UnboundLocalError。
修复方案
你只需要保证每次循环时l和r都会被赋值即可,比如修改为如下写法:
# 写法1:用加法替代or,保证两个海象运算都会执行 while (l := len(left)) + (r := len(right)) > 0: if l and r and left[0] < right[0]: output.append(left.pop(0)) elif r: output.append(right.pop(0)) else: output.append(left.pop(0))
或者更易读的常规写法:
# 写法2:提前赋值两个变量,再判断终止条件 while True: l = len(left) r = len(right) if not l and not r: break # 原有归并逻辑不变 if l and r and left[0] < right[0]: output.append(left.pop(0)) elif r: output.append(right.pop(0)) else: output.append(left.pop(0))
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

