问题描述
如果要确定某个值是否完全为True(而不仅仅是类似True的值),是否有任何理由使用foo == True而不是foo为True?
如果要确保foo
确实是一个布尔值且具有值True
,请使用is
运算符。
否则,如果与相比时foo
实现了__eq__()
返回true值的实现类型,则True
可能会导致意外结果。
作为一个经验法则,你应该总是使用is
与内置常量True
,False
和None
。
这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
从理论上讲,is
它将比==
后者更快,因为后者必须遵守类型的自定义__eq__
实现,同时is
可以直接比较对象标识(例如,内存地址)。
我并不是很清楚各种Python实现的源代码,但是我认为大多数实现可以通过使用一些内部标志来优化魔术方法的存在,因此我怀疑您不会注意到速度差异在实践中。
解决方法
使用标准if foo is None
而不是if foo == None
测试特定值是否是标准约定None
。
如果要确定一个值是否准确True
(不仅仅是一个真值),是否有使用if foo == True
而不是使用任何理由if foo is
True
?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
示例:sayTrue
用作您要与value'bar'
或其他真值相区别的单例值:
if foo is True: # vs foo == True
...
elif foo == 'bar':
...
是否存在使用if foo is True
会产生与的不同结果的情况if foo == True
?
注意:我知道Python布尔值-如果x :,则x如果x ==
True,则x如果x为True。但是,它只地址是否if
foo
,if foo == True
或if foo is True
一般应被用来确定是否foo
有一个真正般的价值。
更新:根据PEP 285§规范:
值False和True将是单例,如None。