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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:01:25