Python3罗马数字转整数时roman[s[i:i+2]]为何未触发KeyError
罗马数字转整数Python代码逻辑问题排查
为什么没有触发KeyError
核心原因是对if条件的短路求值规则理解有误:
原代码if判断为i+1<len(s) and s[i:i+2] in roman,Python里的and是短路运算符,只有前半段条件成立,才会执行后半段判断;必须两个条件全满足,才会进入if分支执行字典查询。
当切出来的双字符(比如"II")不在roman字典里时,if条件直接判定不成立,直接跳转到else分支,根本不会执行roman[s[i:i+2]]这行查询不存在键的代码,自然不会抛出KeyError。
你单独测试时触发KeyError,是因为跳过了"II" in roman这个存在性检查,直接执行roman["II"]查询不存在的键,和原代码的执行逻辑完全不同。
为什么运行结果是2,和推演结果不符
推演错误的核心是默认只要i+1<len(s)成立就会进入if分支,忽略了后面的双字符键存在校验——实际上只要双字符组合不在字典里(比如"II"),就根本进不了if分支,全程走else分支逐字符累加单字符对应的值。
跑出2的结果,基本是因为实际运行时s被改成了长度为2的"II"(大概率是调试时修改了赋值没改回代码里写的"III"),逐轮执行流程如下:
初始值:i=0,num=0,s="II"(长度2)
- 第一轮循环(i=0):
校验if条件:i+1=1 < 2成立,接着判断s[0:2]也就是"II"是否在roman字典中,结果为否,if条件整体不成立,进入else分支:
累加s[0]即"I"对应的1,num变为1,i自增为1。 - 第二轮循环(i=1):
校验if条件:i+1=2 < 2不成立,直接短路进入else分支:
累加s[1]即"I"对应的1,num变为2,i自增为2,不满足循环条件,退出循环打印2,和实际运行结果完全匹配。
注:else分支里单独写的
num是无效冗余代码,既没有打印操作也没有赋值操作,只是取出变量值后直接丢弃,对运行结果没有任何影响。
如果s确实是代码中写的"III",正常运行结果应该是3,走三次else分支每次累加1即可得到。
内容的提问来源于stack exchange,提问作者RValentin
相关产品推荐
相关产品推荐

