Python调用str.lower()后字符串包含判断结果异常的原因
问题原因解释
核心问题是你对Python逻辑运算符and的运算规则、运算符优先级理解错了,判断语句的写法完全不符合预期,两次结果差异本质是写错判断逻辑后的巧合。
两个必须先明确的基础规则
- 非空字符串在Python里的布尔值永远是
True,和它是否存在于目标字符串里没有任何关系 - 运算符优先级上,成员判断
in的优先级高于逻辑与and;and是短路运算,会从左到右依次判断值的真假,遇到第一个假值就直接返回,否则返回最后一个真值
逐段拆解你的判断逻辑
你写的判断语句if "gtx" and "560" and "ti" in test:,根本不是判断三个子串都在test里,实际运算顺序是:
- 先算最左边的
"gtx" and "560":两个都是非空字符串,都是真值,这一步返回"560" - 再算上一步结果和后面的部分:
"560" and ("ti" in test)——只有最后一个"ti"做了是否在test里的判断,前面的"gtx"、"560"根本没做成员校验,只是判断了字符串本身是不是空
第一个判断(未转小写)为什么返回nope
原test值是"GTX1050Ti 4GB","ti" in test的结果是False(原串里是大写开头的Ti,没有小写ti子串),所以整个表达式最终是"560" and False,结果为假,走else分支打印nope。
第二个判断(转小写后)为什么错误打印了GTX 560 Ti
test转小写后是"gtx1050ti 4gb",此时"ti" in test.lower()的结果是True,整个表达式变成"560" and True,结果为真。
注意:这个结果完全不符合实际——转小写后的字符串里根本没有"560"子串,只是因为你的写法根本没校验"gtx"、"560"是否存在,只要最后一个"ti"匹配到了,整个判断就会通过,属于典型的逻辑bug。
正确写法
要判断多个子串都存在于目标字符串,必须给每个子串单独写in判断:
test = "GTX1050Ti 4GB" # 正确写法1 if "gtx" in test.lower() and "560" in test.lower() and "ti" in test.lower(): print("GTX 560 Ti") else: print("nope") # 正确写法2(更简洁,适合子串多的场景) if all(key in test.lower() for key in ("gtx", "560", "ti")): print("GTX 560 Ti") else: print("nope")
上面两种正确写法运行后都会打印nope,符合字符串实际内容。
内容的提问来源于stack exchange,提问作者Charles David Mupende
相关产品推荐
相关产品推荐

