布尔身份== True与True

问题描述

如果要确定某个值是否完全为True(而不仅仅是类似True的值),是否有任何理由使用foo == True而不是foo为True?

如果要确保foo确实是一个布尔值且具有值True,请使用is运算符。

否则,如果与相比时foo实现了__eq__()返回true值的实现类型,则True可能会导致意外结果。

作为一个经验法则,你应该总是使用is与内置常量TrueFalseNone

这在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 fooif foo == Trueif foo is True一般应被用来确定是否foo有一个真正般的价值。


更新:根据PEP 285§规范:

值False和True将是单例,如None。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...