布尔身份== 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。

相关文章

猜你在找的编程问答相关文章

在Pandas数据框中旋转数据表
如何获得浮点序列中的下一个值?
获取Instagram粉丝
在批处理结束时检测到不可提交的事务。交易回滚
将一个文本文件文件夹与一个单元格中的每个内容合并为一个CSV文件
在使用JSON数据时,如何防止我的应用程序意外崩溃,“关闭”,而代之以处理异常?
JDBC批处理INSERT,返回ID
具有多个表的复杂INNER JOIN查询的回显结果