Python两段字符串数值比较代码运行表现不一致原因咨询
两段Python字符串比较逻辑差异原因
Python中字符串类型的大小比较规则是逐字符比对对应字符的Unicode编码值,而非按字符串代表的数值大小计算。如果两个字符串前N位字符都相同,长度更短的字符串判定为更小。
第一段代码看似正常的原因
第一段代码的判断条件为nota_final >= '70',仅在常见输入场景下巧合符合预期:
- 小于70的合法分数分为两类:
- 1位数字字符串(0-9):和2位的'70'比较时,要么第一位字符的Unicode值小于'7',要么第一位等于'7'但长度更短,最终比较结果均为小于'70'
- 2位数字字符串(10-69):第一位字符为'1'到'6',Unicode值均小于'7',比较结果自然小于'70'
- 70-99的2位数字字符串:第一位字符为'7'到'9',Unicode值大于等于'7',比较结果大于等于'70'
注意:该逻辑本质仍然是错误的,如果输入分数为100,字符串'100'第一位是'1',Unicode值小于'7',会判定为小于'70',输出不符合预期,只是测试时没有覆盖该场景才看似正常。
第二段代码不符合预期的原因
第二段代码的判断条件为nota >= '10',直接暴露了字符串比较的问题:
如果输入小于10的个位数(比如9),对应的字符串是'9',逐位比较第一位时,'9'的Unicode值远大于'1',因此'9' >= '10'的比较结果为True,会直接触发if分支的打印逻辑,和预期的数值9<10的结果完全相反,因此出现不符合预期的情况。
正确做法
无论哪段代码,直接用input返回的字符串做数值大小比较都是错误的做法,必须先通过int()将字符串转换为整数后再做比较,才能保证所有场景下逻辑正确。
内容的提问来源于stack exchange,提问作者Carlos Silva
相关产品推荐
相关产品推荐

