python中if语句判断元素是否存在于列表中——if x: / if x is True: / if x == True: 的区别
用x in list可以判断一个元素是否在list中,存在则返回True,不存在则返回False。所以我一开始就想直接用 == True来判断。这样运行不会报错,但是却不能正确判断、没有输出结果。这个时候Pycharm提示:Comparison to True should be 'if cond is True' or 'if cond:' . 意思是:和True的比较应该写成 is True 或者 if默认判断,不能用 == True 的形式。
于是我又换成了 is True的写法。这样运行同样没有报错,但还是不能正确判断、没有输出Yes。后来发现不是is True这种表达有问题,而是应该加一个括号,因为x in list在这里代表的是一个值。
最后我换成了if默认判断的写法。这样终于可以成功判断了。
在StackOverflow上面看到了一个关于这个问题的讨论。我根据自己的理解简单翻译总结了里面几个大佬说的重点。
实际上,True和False并不只有一种含义。它不仅仅可以被看做一个简单的布尔类型的值,它还可以被当成每一个对象都具有的属性。就比如'123',[1,2,3]等等,大多数对象都是属性为True的真值;False、None、数值为0的数字、空字符串列表元组字典等等,规定了一小部分对象是属性为False的值。所以,在用if语句的时候要先想清楚自己判断的是哪一种含义的True和False。
if cond: 区分的是属性值。也就是不光赋值为True 的值会被判断为对,非0数字、非空列表等属性为True的值也都会被判断为对。在你确定自己判断的值赋值只有True和False时,或你要判断的就是属性值时,可以使用if cond: 达到想要的效果。
if cond is True: 区分的是单纯的True和False赋值。属性为真的值不会通过判断。但这个表达不够简洁明了,而且像上面x in list这种情况还需要加括号,在这方面不如if cond:。
下面是StackOverflow的原帖:
https://stackoverflow.com/questions/20420934/if-x-vs-if-x-true-vs-if-x-is-true